2016-09-23 99 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)'。 –