使用组内的移位创建新列{value

时间:2017-07-04 21:54:55

标签: pandas

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

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

正如您从输出中看到的那样,值会在不考虑分组的情况下进行后移。

我已经看到了类似的问题,但我无法弄清楚为什么它不能按预期工作。

Python Pandas: how to add a totally new column to a data frame inside of a groupby/transform operation

1 个答案:

答案 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