首页 > 解决方案 > 如何使用groupby在满足多个条件的熊猫数据框中保留最佳行

问题描述

我有一个看起来像这样的熊猫数据框:

   experiment  replicate  count   fdr
0           a          1     10  0.01
1           a          1      8     0
2           a          1      9     0

我想按experimentand分组replicate并保留具有最小值的行fdr,但如果有多个具有相同最小值fdr的行,请使用具有最大值的行count

所以我的预期输出是

   experiment  replicate  count   fdr
2           a          1      9     0

通过阅读其他帖子,我可以根据单个条件执行此操作,例如:

df.groupby(['experiment', 'replicate']).fdr.transform(min)

但我不知道如何在两个条件下做到这一点。我相信我需要apply而不是transform,但我仍在努力让某些东西起作用。

标签: pythonpandaspandas-groupby

解决方案


您可能需要以非常具体的方式对数据框进行排序。如果您Falseascending参数中的最后一个更改为True,那么您会得到不同的答案,因此您应该确保它是这样排序的。

然后,使用可以使用你的groupbywithidxmin()[0]返回索引最小值([0]去掉系列索引,所以你只得到原始值),然后通过它过滤数据框。

df = df.sort_values(['experiment', 'replicate', 'fdr', 'count'],
                    ascending=[True, True, True, False])
df[df.index == df.groupby(['experiment', 'replicate']).fdr.idxmin()[0]]

# Per @wwii's comment a slightly cleaner way and likely most syntactical

df.loc[df.groupby(['experiment', 'replicate']).fdr.idxmin(),:]

Out[1]: 
  experiment  replicate  count  fdr
2          a          1      9  0.0

推荐阅读