python - 熊猫。将 n 个不可告人的行值“转换”为先前行值的最佳方法是什么?(乘以列-1)
问题描述
在第一种情况下,行的分组是 two,但想法是将其推广到 N 行的分组。
这个想法是这样的:
df
x1 x2 x3 y
0 1 2 3 NaN
1 5 6 7 8
2 9 10 11 12
3 13 14 15 16
4 17 18 19 NaN
进入这个:
df_grouped2
x1 x2 x3 x4 x5 x6 y
0 1 2 3 5 6 7 8
1 5 6 7 9 10 11 12
2 9 10 11 13 14 15 16
3 13 14 15 17 18 19 NaN
如果我们将原始 df 分组为 3 行,则得到:
df_grouped3
x1 x2 x3 x4 x5 x6 x7 x8 x9 y
0 1 2 3 5 6 7 9 10 11 12
1 5 6 7 9 10 11 13 14 15 16
2 9 10 11 13 14 15 17 18 19 NaN
我找不到执行此操作的功能或方法。我正在尝试创建一个函数来做到这一点,但我脑海中的想法是迭代和详尽的(循环所有数据集)。
我不知道是否可以以更简单的方式完成诸如“pivot”或“shift”之类的熊猫功能的组合。
有什么想法?
提前致谢。
解决方案
@Nonamecpp
谢谢!不错的方法,遵循这个想法,我试图将其概括为一个函数,但我有一个问题,我看不到解决方案。
当我为两个以上的行分组运行该函数时,输出会生成错误的列(具有不必要的行值)。
功能:
def move(df,row_agruped):
while row_agruped > 2:
df = move(df,2)
row_agruped = row_agruped-1
x = df
z = x.shift(-1)
num_cols = len(x.columns)
rng = range(num_cols, num_cols-1 +((num_cols)))
new_cols = ['x'+str(i) for i in rng] + ['y']
z.columns = new_cols
xt = x.iloc[:,:len(x.columns)-1]
return pd.concat([xt,z],axis=1,sort=False).iloc[:((row_agruped)-3)]
对于 N=3,函数返回:
move(x,3)
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 y
0 1 2 3 5.0 6.0 7.0 5.0 6.0 7.0 9.0 10.0 11.0 12
1 5 6 7 9.0 10.0 11.0 9.0 10.0 11.0 13.0 14.0 15.0 16
2 9 10 11 13.0 14.0 15.0 13.0 14.0 15.0 17.0 18.0 19.0 NaN
(注意 x4 == x7、x5 == x8、x6 == x9 列中的错误)
但它应该返回这个:
x1 x2 x3 x4 x5 x6 x7 x8 x9 y
0 1 2 3 5.0 6.0 7.0 9.0 10.0 11.0 12
1 5 6 7 9.0 10.0 11.0 13.0 14.0 15.0 16
2 9 10 11 13.0 14.0 15.0 17.0 18.0 19.0 NaN
推荐阅读
- android - 通过 AWS Pinpoint 向指定用户发送推送通知
- sql - Foreign key with distinguisher
- ruby-on-rails - 将 ActiveStorage 配置为将 S3 与 IAM 角色一起使用
- javascript - Javascript - Uncaught TypeError: Cannot read property 'length' of undefined
- selenium - Not able to click a value in Input drop down
- docker - 如何强制“docker login”命令忽略现有的凭据助手?
- sql - Calculate all days, group by week and include empty weeks?
- python - Python replace entire string if it begin with certain character in dataframe
- javascript - How do I mock constructor state initialisation with Jest
- java - 如何从 MIDI 文件中提取速度