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