如何在Groupby中保留其他列的行值?

时间:2019-05-27 10:16:40

标签: python pandas dataframe

我有一个数据框:

df = pd.DataFrame()
df['bird'] = ['shikra','shikra','eagle','eagle','eagle','crow','sparrow','sparrow']
df['bird2'] = [1,1,2,2,2,3,4,4]
df['n'] = ['a','b','c','d','e','f','g','h']
df['range'] = [1400,1600,np.nan,2800,3300,np.nan,800,600]

    bird    bird2   n   range
0   shikra  1   a   1400.0
1   shikra  1   b   1600.0
2   eagle   2   c   NaN
3   eagle   2   d   2800.0
4   eagle   2   e   3300.0
5   crow    3   f   NaN
6   sparrow 4   g   800.0
7   sparrow 4   h   600.0

我想从大约数据中找到最大范围内的前2名鸟。

我使用了groupby操作,如下所示:

df.groupby(['bird','bird2']).agg({'range':'max', 'n':'first'}).reset_index().sort_values('range', ascending=False).head(2)

其输出为:

    bird    bird2   range   n
1   eagle   2      3300.0   c
2   shikra  1      1600.0   a

以上输出的唯一问题是column n。当我在first中选择了agg时,它为对应的groupby值提供了第一个值,但实际上我想要的是n的值,它与最大范围有关。

如何从nrange的{​​{1}}列中选择值

预期输出:

max

2 个答案:

答案 0 :(得分:4)

首先使用DataFrame.sort_values,然后通过DataFrame.drop_duplicates删除两列中的重复项,并通过DataFrame.headDataFrame.iloc选择最高值:

df = df.sort_values('range', ascending=False).drop_duplicates(['bird','bird2']).head(2)

#df = df.sort_values('range', ascending=False).drop_duplicates(['bird','bird2']).iloc[:2]
print (df)
     bird  bird2  n   range
4   eagle      2  e  3300.0
1  shikra      1  b  1600.0

答案 1 :(得分:2)

您也可以直接使用max函数:

df.groupby(['bird','bird2']).max().reset_index().sort_values('range', ascending=False).head(2)

    bird    bird2   n   range
1   eagle   2       e   3300.0
2   shikra  1       b   1600.0

正如jezreal提到的,在您的情况下,max还将找到最大字符串f。但是,当您按范围对它进行排序时,它就位了。