如何用Pandas原生方法获取各分类列对应的最大值?
问题描述
现有如下Pandas数据表:
name time 0 A 1 1 A 2 2 B 3 3 A 6 4 A 7 5 A 3 6 B 1 7 B 4
每一行包含分类名称(name列)和对应的数值信息(time列)。需求是生成一张仅包含唯一name分类及其对应time列最大值的表。
当前的实现方式如下:
max_table = pd.DataFrame( { "name": data.name.unique(), "max_val": [ data[data["name"] == name].time.max() for name in data.name.unique() ], } )
这种方式需要在数据表和列表间转换,不够符合Pandas的原生风格,请问是否有仅用Pandas原生调用实现该需求的方法?
完整示例代码(含数据创建):
data = pd.DataFrame( { "name": pd.Categorical(["A", "A", "B", "A", "A", "A", "B", "B"]), "time": [1, 2, 3, 6, 7, 3, 1, 4], } ) print(data) print("======================") max_table = pd.DataFrame( { "name": data.name.unique(), "max_val": [ data[data["name"] == name].time.max() for name in data.name.unique() ], } ) print(max_table)
解决方案
当然有,Pandas原生的分组聚合功能就能完美解决这个问题,无需手动遍历和列表转换,以下是两种简洁高效的实现方式:
方法1:分组后直接取最大值
通过groupby()按name列分组,然后对time列调用max()方法,最后用reset_index()将分组索引转为列,并重命名结果列:
max_table = data.groupby('name')['time'].max().reset_index(name='max_val')
方法2:使用聚合函数agg()
如果后续需要扩展多个聚合操作(比如同时取最大值、最小值),agg()会更灵活。针对当前需求,写法如下:
max_table = data.groupby('name').agg(max_val=('time', 'max')).reset_index()
结果验证
运行上述任意一种方法,得到的max_table结果如下:
name max_val 0 A 7 1 B 4
和你原代码的输出完全一致,但代码更符合Pandas的原生风格,执行效率也更高(尤其是处理大数据集时)。
内容的提问来源于stack exchange,提问作者Fantastic Mr Fox
相关产品推荐
相关产品推荐

