我正在尝试基于两列过滤熊猫数据框,以便对于第一列中的每个值只保留那些行,其中第二列是最小的。我知道这样听起来很混乱,所以这里有个例子:
> 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
。但是,如何使用该系列过滤原始数据帧?还是有更简单的方法来做到这一点?我尝试了以下几种变化:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句