[英]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
,最小ppm
是1
,对于anno2
,最小ppm
是2
(保留两行。)。 所以我从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.