Python 熊猫。哪一种是最好的方式;“移位”;将n个其他行值转换为先前行值?(乘列-1)
在第一种情况下,行的分组是两行,但其思想是将其推广到N行的分组 我们的想法是扭转这种局面:Python 熊猫。哪一种是最好的方式;“移位”;将n个其他行值转换为先前行值?(乘列-1),python,pandas,dataframe,pivot,shift,Python,Pandas,Dataframe,Pivot,Shift,在第一种情况下,行的分组是两行,但其思想是将其推广到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 x1 x2 x3 x4 x5 x6 x7 x8 x9 y 0 1 2 3 5.0
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
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
为此:
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
我找不到一个函数或方法来实现这一点。我正试图创建一个函数来实现它,但我脑海中浮现的想法是迭代的、彻底的(在整个数据集中循环)
我不知道pandas功能的某些组合,如“pivot”或“shift”,是否可以用一种更简单的方法来实现
有什么想法吗
提前感谢。让x作为原始数据帧
z = x.shift(-1)
z.columns = ['x4','x5','x6','y']
col = set(x.columns)
col.remove('y')
xt = x[col]
pd.concat([xt,z],axis=1,sort=False).iloc[:-1]
对于N=3:
z2 = x.shift(-2)
z2.columns = ['x7','x8','x9','y']
col = set(z.columns)
col.remove('y')
zt = z[col]
pd.concat([xt,zt,z2],axis=1,sort=False).iloc[:-2]
注意:对于第N代,使用x.shift(-1)、x.shift(-2)直到
x、 移位(-(N-1)),您可以使用for循环实现这一点
@诺曼克普
谢谢!很好的方法,遵循这个想法,我试图将其推广到一个函数中,但我有一个问题,我看不到解决方案
当我为两个以上的行分组运行函数时,输出会生成错误的列(带有不必要的行值)
职能:
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中的错误)
但它应该返回以下内容:
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
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
NaN
是值np.NaN
还是字符串'NaN'
?此外,您是否希望将每5行转换为4行,例如,您是否有多个类似4行的块?您是否只需要查找df.shift(-1)
?@QuangHoang是的,NaN是“非数字”或np.NaN。在这个从到2行分组的特殊情况下,是的,df从5行到4行,但是在这个示例中,如果我们从到3行分组,最终的df将从5行到3行。