Pandas。 "shifting" 将 n 个别有用心的行值转换为先前行值的最佳方法是什么? (乘以第 1 列)
Pandas. Which is the best way of "shifting" the n ulterior row values into precedent row values? (multiplying columns-1)
在第一种情况下,行的分组是两个,但我们的想法是将其概括为 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
我找不到执行此操作的函数或方法。我正在尝试创建一个函数来执行此操作,但我想到的想法是 迭代和详尽 (遍历整个数据集)。
我不知道 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]
Note: For generation N , use x.shift(-1) , x.shift(-2) until
x.shift(-(N-1)), You can implement this using a for loop
@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,函数 return 是这样的:
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 列中的错误)
但它应该return这样:
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
在第一种情况下,行的分组是两个,但我们的想法是将其概括为 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
我找不到执行此操作的函数或方法。我正在尝试创建一个函数来执行此操作,但我想到的想法是 迭代和详尽 (遍历整个数据集)。
我不知道 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]
Note: For generation N , use x.shift(-1) , x.shift(-2) until x.shift(-(N-1)), You can implement this using a for loop
@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,函数 return 是这样的:
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 列中的错误)
但它应该return这样:
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