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

如何在Pandas中按UserID分组后添加min/max列并保留原数据?

按UserID分组添加聚合列的解决方案

你可以用Pandas的groupby()搭配transform()方法,既能按UserID分组计算所需的聚合值,又能直接把结果匹配到原DataFrame的每一行,不会产生烦人的多级索引。

1. 构造示例数据

先把你提供的DataFrame用代码还原:

import pandas as pd

df = pd.DataFrame({
    'UserID': ['A123456', 'A123456', 'B123456', 'B123456', 'B123456'],
    'LoginDate': ['2023-04-01', '2023-04-10', '2023-04-05', '2023-04-06', '2023-04-07'],
    'PlacedOrderItems': [1, 0, 0, 2, 0],
    'Other column': ['a', 'b', 'c', 'd', 'e']
})
# 可选:将LoginDate转为日期类型,确保min计算准确
df['LoginDate'] = pd.to_datetime(df['LoginDate'])

2. 添加目标聚合列

transform()方法会为每个分组计算聚合值,然后自动把结果广播到原DataFrame的对应行,完全保留原结构:

# 新增每组的最小登录日期列
df['min_login_date'] = df.groupby('UserID')['LoginDate'].transform('min')
# 新增每组的最大下单商品数列
df['max_order_items'] = df.groupby('UserID')['PlacedOrderItems'].transform('max')

最终结果

执行完代码后,得到的DataFrame和你想要的结构一致:

UserIDLoginDatePlacedOrderItemsOther columnmin_login_datemax_order_items
A1234562023-04-011a2023-04-011
A1234562023-04-100b2023-04-011
B1234562023-04-050c2023-04-052
B1234562023-04-062d2023-04-052
B1234562023-04-070e2023-04-052

关于之前的多级索引问题

如果你之前用的是groupby().agg(),默认会把分组列UserID设为索引,导致出现多级结构。而transform()不会修改原DataFrame的索引,返回的结果行数和原数据完全一致,刚好满足你的需求。

内容的提问来源于stack exchange,提问作者Khurram Majeed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:05:44