按单列对分组的Pandas数据框求和

1 投票
1 回答
7677 浏览
提问于 2025-04-18 06:28

我有一个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

撰写回答