Pandas 在groupby值中使用shift键创建新列

Pandas 在groupby值中使用shift键创建新列,pandas,Pandas,我想创建一个新列,它是应用于分组值的shift函数的结果 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):

我想创建一个新列,它是应用于分组值的shift函数的结果

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
正如您可以从输出中看到的,这些值是顺序移位的,而不考虑分组

我看到了一个类似的问题,但我不明白为什么它不能像预期的那样工作


值在不考虑组的情况下移动,因为您的
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