簡體   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