You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:54:24