2017-07-04 50 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