按单列对分组的Pandas数据框求和
我有一个Pandas的数据表:
test=pd.DataFrame(columns=['GroupID','Sample','SampleMeta','Value'])
test.loc[0,:]='1','S1','S1_meta',1
test.loc[1,:]='1','S1','S1_meta',1
test.loc[2,:]='2','S2','S2_meta',1
我想要做以下几件事:(1) 按照两列('GroupID'和'Sample')进行分组,(2) 对每个组的'Value'进行求和,(3) 每个组中只保留'SampleMeta'的唯一值。想要的结果('GroupID'和'Sample'作为索引)如下:
SampleMeta Value
GroupID Sample
1 S1 S1_meta 2
2 S2 S2_meta 1
使用df.groupby()和.sum()方法可以接近这个目标,但.sum()会把同一组中'Values'列的相同值合并在一起。因此,'S1_meta'的值就重复了。
g=test.groupby(['GroupID','Sample'])
print g.sum()
SampleMeta Value
GroupID Sample
1 S1 S1_metaS1_meta 2
2 S2 S2_meta 1
有没有办法使用groupby()和相关的方法来实现想要的结果?将每组的求和'Value'与一个单独的'SampleMeta'数据表合并是可行的,但我觉得应该有更优雅的解决方案。
1 个回答
0
好吧,你可以把 SampleMeta
加入到分组操作中:
print test.groupby(['GroupID','Sample','SampleMeta']).sum()
Value
GroupID Sample SampleMeta
1 S1 S1_meta 2
2 S2 S2_meta 1
如果你不想在最后的结果中把 SampleMeta
作为索引的一部分,你可以这样修改:
print test.groupby(['GroupID','Sample','SampleMeta']).sum().reset_index(level=2)
SampleMeta Value
GroupID Sample
1 S1 S1_meta 2
2 S2 S2_meta 1
这样做只有在 ['GroupID','Sample']
中 SampleMeta
没有变化的时候才有效。当然,如果 ['GroupID','Sample']
中有变化,那你可能需要完全把 SampleMeta
从分组和求和中排除:
print test.groupby(['GroupID','Sample'])['Value'].sum()
GroupID Sample
1 S1 2
2 S2 1