我想创建一个新列,它是应用于分组值的移位函数的结果。
df = pd.DataFrame({'X': [0,1,0,1,0,1,0,1], 'Y':[2,4,3,1,2,3,4,5]})
df
X Y
0 0 2
1 1 4
2 0 3
3 1 1
4 0 2
5 1 3
6 0 4
7 1 5
def func(x):
x['Z'] = test['Y']-test['Y'].shift(1)
return x
df_new = df.groupby('X').apply(func)
X Y Z
0 0 2 NaN
1 1 4 2.0
2 0 3 -1.0
3 1 1 -2.0
4 0 2 1.0
5 1 3 1.0
6 0 4 1.0
7 1 5 1.0
正如您从输出中看到的那样,值会在不考虑分组的情况下进行后移。
我已经看到了类似的问题,但我无法弄清楚为什么它不能按预期工作。
答案 0 :(得分:1)
由于您的func
使用test
(可能是其他对象,可能是您称之为df
的另一个名称)而不是简单地使用组,因此会移动这些值而不考虑这些组x
。
def func(x):
x['Z'] = x['Y']-x['Y'].shift(1)
return x
给了我
In [8]: df_new
Out[8]:
X Y Z
0 0 2 NaN
1 1 4 NaN
2 0 3 1.0
3 1 1 -3.0
4 0 2 -1.0
5 1 3 2.0
6 0 4 2.0
7 1 5 2.0
但请注意,在这种特殊情况下,您不需要编写自定义函数,只需直接在groupby对象上调用diff
即可。 (当然,您可能想要使用的其他功能可能会更复杂。)
In [13]: df_new["Z2"] = df.groupby("X")["Y"].diff()
In [14]: df_new
Out[14]:
X Y Z Z2
0 0 2 NaN NaN
1 1 4 NaN NaN
2 0 3 1.0 1.0
3 1 1 -3.0 -3.0
4 0 2 -1.0 -1.0
5 1 3 2.0 2.0
6 0 4 2.0 2.0
7 1 5 2.0 2.0