熊猫groupby并附加原始值。计算每行的平均值

时间:2019-06-20 10:46:18

标签: python-3.x pandas

我有一个IDValue s的数据框。其中ID是重复试验,而Value是结果。 我想用groupbyID,对于相同的ID,Values将被添加到相邻的列中。最后,我想计算每行的平均值。

>>>df
   ID  Value
0   1    1.1
1   2    1.2
2   3    2.4
3   1    1.7
4   2    4.3
5   3    2.2
>>>groups = df.groupby(by='ID')

#Now I cannot figure it what to do for my desired output.

我想要类似的输出

   ID  Value_1  Value_2  Mean
0   1    1.1    1.7    1.9
1   2    1.2    4.3    2.75
2   3    2.4    2.2    2.3

2 个答案:

答案 0 :(得分:3)

DataFrame.assign用于由GroupBy.cumcount每组计数器创建的新列,由DataFrame.pivot整形,由DataFrame.add_prefix更改列名称,添加以均值填充并最后添加的新列数据清理-DataFrame.reset_indexDataFrame.rename_axis

df = (df.assign(g = df.groupby('ID').cumcount().add(1))
        .pivot('ID','g','Value')
        .add_prefix('Value_')
        .assign(Mean = lambda x: x.mean(axis=1))
        .reset_index()
        .rename_axis(None, axis=1))
print (df)
   ID  Value_1  Value_2  Mean
0   1      1.1      1.7  1.40
1   2      1.2      4.3  2.75
2   3      2.4      2.2  2.30

答案 1 :(得分:1)

一种可能的解决方案,假设每个 ID 都有2行:

定义要应用于组的函数:

def fn(grp):
    vals = grp.Value.values
    return [ vals[0], vals[-1], grp.Value.mean() ]

然后应用它,并将 ID 列从索引“移动”到常规列:

df2 = df.groupby('ID').apply(fn).apply(pd.Series).reset_index()

最后一点是设置适当的列名称:

df2.columns=[ 'ID', 'Value_1', 'Value_2', 'Mean' ]