簡體   English   中英

根據兩列過濾一個 pandas dataframe

[英]Filter a pandas dataframe based on two columns

我正在嘗試基於兩列過濾 pandas dataframe ,以便對於第 1 列中的每個值,只剩下第 2 列是最小值的那些行。 我知道這聽起來很混亂,所以這里有一個例子:

> df = pd.DataFrame([{'a':'anno1', 'ppm':1},{'a':'anno1', 'ppm':2},{'a':'anno2', 'ppm':2},{'a':'anno2', 'ppm':2}])

> df
       a  ppm
0  anno1    1
1  anno1    2
2  anno2    2
3  anno2    2

我想要第 0,2 和 3 行,因為對於anno1 ,最小ppm1 ,對於anno2 ,最小ppm2 (保留兩行。)。 所以我從groupby開始:

> grouped_series = df.groupby(['a']).ppm.min()
> grouped_series
a
anno1    1
anno2    2

現在我a最小ppm中的每個值。 但是怎么用這個系列過濾掉原來的dataframe呢? 或者有沒有更簡單的方法來做到這一點? 我嘗試了幾種變體:

new_df = df.loc[ df.loc[:,'ppm']==grouped_series.loc[df.loc[:,'a']] , :]

但這給了我一個ValueError: Can only compare identically-labeled Series objects

使用GroupBy.transform將最小值與具有相同大小的Series (如df )進行比較,因此比較工作得很好,也用於過濾boolean indexing中的loc索引不需要:

new_df = df[df['ppm'] == df.groupby('a').ppm.transform('min')]
print (new_df)
       a  ppm
0  anno1    1
2  anno2    2
3  anno2    2

如果您不介意重置原始索引,這是一種替代方法:

df.merge(df.groupby(['a'])['ppm'].min().reset_index(), how='inner')

Output:

    a   ppm
0   anno1   1
1   anno2   2
2   anno2   2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM