2017-07-04 26 views
0

我想要创建一个新列,该列是应用于分组值的移位功能的结果。使用groupby内的移位值创建新列

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

的值被移到不占群体,因为你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 
+0

这很棒,按预期工作。谢谢。 – olyashevska