Pandas groupby -- 根据另一列的最大值获取输出值

Pandas groupby -- get output value based on max value of another column

我有以下数据框:

df = pd.DataFrame({'Animal': ['Falcon', 'Falcon',
                              'Parrot', 'Parrot'],
                   'Habitat':['Jungle', 'Jungle',
                              'Sky', 'Sky'],
                   'Tmp':['A', 'B', 'C', 'D'],
                   'Max Speed': [380., 370., 24., 26.]})

>>> df
   Animal Habitat Tmp  Max Speed
0  Falcon  Jungle   A      380.0
1  Falcon  Jungle   B      370.0
2  Parrot     Sky   C       24.0
3  Parrot     Sky   D       26.0

我正在尝试添加额外的“输出”列,它将根据“动物”和“栖息地”列的分组中“最大速度”列的最大值从“Tmp”中获取值。

期望的输出:

   Animal Habitat Tmp  Max Speed Output
0  Falcon  Jungle   A      380.0      A
1  Falcon  Jungle   B      370.0      A
2  Parrot     Sky   C       24.0      D
3  Parrot     Sky   D       26.0      D

可以使用 groupby 完成,然后将其加入原始数据集中。但是有没有更有效的方法来做到这一点?也许使用 transform 或其他东西?

你可以定义一个以pd.dataframe为参数的函数:

import pandas as pd
import numpy as np

def fmax(df_):
    df_['Output'] = df_.sort_values(['Max Speed']).tail(1)['Tmp'].squeeze()
    return df_

请注意 pandas.DataFrame.squeeze 函数对 return 标量值的使用。 然后简单地 apply 上面的函数使用 groupby:

df.groupby(['Animal','Habitat']).apply(fmax)

结果是:

   Animal Habitat Tmp  Max Speed Output
0  Falcon  Jungle   A      380.0      A
1  Falcon  Jungle   B      370.0      A
2  Parrot     Sky   C       24.0      D
3  Parrot     Sky   D       26.0      D