我有一个ID
和Value
s的数据框。其中ID
是重复试验,而Value
是结果。
我想用groupby
做ID
,对于相同的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
答案 0 :(得分:3)
将DataFrame.assign
用于由GroupBy.cumcount
每组计数器创建的新列,由DataFrame.pivot
整形,由DataFrame.add_prefix
更改列名称,添加以均值填充并最后添加的新列数据清理-DataFrame.reset_index
与DataFrame.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' ]