![](/img/trans.png)
[英]In a Pandas dataframe, how to filter a set of rows based on a start row and end row both satisfying different conditions?
[英]How to keep the best row in a pandas dataframe satisfying multiple conditions with groupby
我有一个 pandas dataframe 看起来像这样:
experiment replicate count fdr
0 a 1 10 0.01
1 a 1 8 0
2 a 1 9 0
我想按experiment
分组并replicate
并保留具有最小fdr
的行,但如果有多行具有相同的最小fdr
,请使用具有最大count
的行。
所以我预期的 output 将是
experiment replicate count fdr
2 a 1 9 0
通过阅读其他帖子,我可以根据单个条件执行此操作,例如:
df.groupby(['experiment', 'replicate']).fdr.transform(min)
但我不知道如何在两个条件下做到这一点。 我相信我需要apply
而不是transform
,但我仍在努力让某些东西发挥作用。
您可能需要以非常具体的方式对 dataframe 进行排序。 如果您在ascending
参数中的最后一个False
更改为True
,那么您会得到不同的答案,因此您应该确保它是这样排序的。
然后,可以使用带有idxmin()[0]
的groupby
来返回索引最小值( [0]
摆脱了系列索引,所以你只得到原始值),然后过滤 dataframe 。
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
您可以首先获取最小值,与每一行进行比较,然后获取具有最大计数的索引,最后过滤该行:
cond1 = df.groupby(["experiment", "replicate"]).fdr.transform("min")
row_with_max_count = df.loc[df.fdr.eq(cond1), "count"].idxmax()
df.loc[[row_with_max_count]]
experiment replicate count fdr
2 a 1 9 0.0
import pandas as pd
data = { 'experiment' : ['a', 'a', 'a'],
'replicate' : [1, 1, 1],
'count' : [10,8,9],
'fdr' : [0.01,0,0],}
df = pd.DataFrame(data)
给
experiment replicate count fdr
0 a 1 10 0.01
1 a 1 8 0.00
2 a 1 9 0.00
df.groupby(['experiment', 'replicate']).min('fdr')
count fdr
experiment replicate
a 1 8 0.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.