2016-09-23 82 views
0

我有一個數據框的幾列,我排序,按索引分組,並計算組中的每一行和下一個之間的差異。接下來我想添加最後3個差異的方法列。例如:pandas - 添加一組最後3個元素的平均值由

index A B A_diff B_diff A_diff_last3mean B_diff_last3mean 
1111 1 2  0  0    NaN    NaN 
1111 1 2  0  0    NaN    NaN     
1111 2 4  1  2    0.33    0.67 
1111 4 6  2  2    1    1.33 
2222 5 7  NaN  NaN    NaN    NaN #index changed 
2222 2 8  -3  1    NaN    NaN 

我設法使用

df=df.join(df.groupby(['index'],sort=False,as_index=False).diff(),rsuffix='_diff') 
y=df.groupby(['index'],sort=False,as_index=False).nth([-1,-2,-3]) 
z=y.groupby(['index'],sort=False,as_index=False).mean() 

創建此類列,但創建一個聚合數據幀,我需要在原來的要合併的值。我嘗試使用.transform()函數,但沒有成功。非常感謝你的幫助。

回答

1
import io 
import pandas as pd 

data = io.StringIO('''\ 
group A B 
1111 1 2 
1111 1 2 
1111 2 4 
1111 4 6 
2222 5 7 
2222 2 8 
''') 
df = pd.read_csv(data, delim_whitespace=True) 

diff = (df.groupby('group') 
      .diff() 
      .fillna(0) 
      .add_suffix('_diff')) 
df = df.join(diff) 

last3mean = (df.groupby('group')[diff.columns] 
       .rolling(3).mean() 
       .reset_index(drop=True) 
       .add_suffix('_last3mean')) 
df = df.join(last3mean) 
print(df) 

輸出:

group A B A_diff B_diff A_diff_last3mean B_diff_last3mean 
0 1111 1 2  0.0  0.0    NaN    NaN 
1 1111 1 2  0.0  0.0    NaN    NaN 
2 1111 2 4  1.0  2.0   0.333333   0.666667 
3 1111 4 6  2.0  2.0   1.000000   1.333333 
4 2222 5 7  0.0  0.0    NaN    NaN 
5 2222 2 8 -3.0  1.0    NaN    NaN 

注:

  • 雖然index是一個完全有效的列名,大熊貓DataFrames有指標了。爲了避免混淆,我已將該列重命名爲group

  • 在您需要的輸出,你似乎在列A_diffB_diff該組1111但不爲組2222以填補了NaN秒。代碼片段中的第一行不會執行這種填充。我已經在diff的定義中填寫了全部— .fillna(0),但是如果需要,您可以刪除它。

+0

謝謝。值得一提的是,它的工作原理是熊貓0.18.1(我需要更新) – nika

+0

對於舊版本,'.rolling(3).mean()'必須替換爲'.rolling_mean(3)'。 –

相關問題