python - 如何使用groupby在满足多个条件的熊猫数据框中保留最佳行
问题描述
我有一个看起来像这样的熊猫数据框:
experiment replicate count fdr
0 a 1 10 0.01
1 a 1 8 0
2 a 1 9 0
我想按experiment
and分组replicate
并保留具有最小值的行fdr
,但如果有多个具有相同最小值fdr
的行,请使用具有最大值的行count
。
所以我的预期输出是
experiment replicate count fdr
2 a 1 9 0
通过阅读其他帖子,我可以根据单个条件执行此操作,例如:
df.groupby(['experiment', 'replicate']).fdr.transform(min)
但我不知道如何在两个条件下做到这一点。我相信我需要apply
而不是transform
,但我仍在努力让某些东西起作用。
解决方案
您可能需要以非常具体的方式对数据框进行排序。如果您False
在ascending
参数中的最后一个更改为True
,那么您会得到不同的答案,因此您应该确保它是这样排序的。
然后,使用可以使用你的groupby
withidxmin()[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
推荐阅读
- r - 根据下一行 R 的值选择行对
- bash - Bash:-gt 运算符未按预期工作
- angular - 在“@angular/cdk/table”中找不到 Angular 9 如何修复导出“CDK_TABLE”
- python - 循环遍历配对列表以合并python中的数据框行
- javascript - 从获取请求中获取 json 值 (API)
- c# - C# 中带有重试逻辑的 Parallel.ForEach 循环
- html - CSS:删除滚动创建的填充
- javascript - 在 for 循环中制作 Synchronus Api
- git - git cherry-pick 内置选项以保留原始提交者和作者
- angular8 - 当aggrid中的主过滤器为空时如何清除条件过滤器