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
我有以下数据框:
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