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

2024-07-06 23:43:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧:

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。因为我在agg中选择了first,它给出了相应groupby值的第一个值,但实际上我想要的是n的值,它与最大范围有关。你知道吗

如何从n列中选择值,其中rangemax

预期输出:

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

Tags: 数据dfnprangenanmaxaggeagle
2条回答

首先使用^{},然后按^{}删除两列的重复项,并按^{}^{}选择顶值:

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

也可以直接使用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。但当你按范围分类时,它就就位了。你知道吗

相关问题 更多 >