我有一个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()连接组中“值”列中的相同值。结果,'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'DataFrame合并,但必须有更优雅的解决方案。
答案 0 :(得分:0)
好吧,您可以将SampleMeta
作为groupby的一部分加入:
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
只有在SampleMeta
['GroupID','Sample']
内没有变化时,此功能才有效。当然,如果['GroupID','Sample']
内存在变化,那么您可能会完全从groupby / sum中排除SampleMeta
:
print test.groupby(['GroupID','Sample'])['Value'].sum()
GroupID Sample
1 S1 2
2 S2 1