如何在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和你想要的结构一致:
| UserID | LoginDate | PlacedOrderItems | Other column | min_login_date | max_order_items |
|---|---|---|---|---|---|
| A123456 | 2023-04-01 | 1 | a | 2023-04-01 | 1 |
| A123456 | 2023-04-10 | 0 | b | 2023-04-01 | 1 |
| B123456 | 2023-04-05 | 0 | c | 2023-04-05 | 2 |
| B123456 | 2023-04-06 | 2 | d | 2023-04-05 | 2 |
| B123456 | 2023-04-07 | 0 | e | 2023-04-05 | 2 |
关于之前的多级索引问题
如果你之前用的是groupby().agg(),默认会把分组列UserID设为索引,导致出现多级结构。而transform()不会修改原DataFrame的索引,返回的结果行数和原数据完全一致,刚好满足你的需求。
内容的提问来源于stack exchange,提问作者Khurram Majeed
相关产品推荐
相关产品推荐

