繁体   English   中英

如何使用 groupby 在满足多个条件的 pandas dataframe 中保持最佳行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM