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