如何为Pandas DataFrame生成用户period=1时的分组编号列?
解决方案
你需要先提取用户在period=1时的分组信息,再将其匹配回原DataFrame的每一行,具体步骤如下:
步骤1:创建用户与period=1分组的映射表
先从原数据中筛选出period=1的记录,提取user和对应的group,确保每个用户只保留一条记录(假设每个用户在period=1只有一个分组):
period1_map = df[df['period'] == 1][['user', 'group']].rename(columns={'group': 'period1'})
步骤2:左连接映射表到原DataFrame
用左连接的方式,将映射表中的period1值匹配到原数据的每一行,没有period=1记录的用户会自动填充NaN(对应你期望结果里的null):
df = df.merge(period1_map, on='user', how='left')
完整代码示例
import pandas as pd # 原DataFrame data = { 'user': [1,2,3,1,2,3,4], 'group': [1,2,2,1,1,1,2], 'period': [1,1,1,2,2,2,2] } df = pd.DataFrame(data) # 创建映射表并合并 period1_map = df[df['period'] == 1][['user', 'group']].rename(columns={'group': 'period1'}) df = df.merge(period1_map, on='user', how='left') print(df)
运行后输出结果与你期望的一致:
user group period period1 0 1 1 1 1.0 1 2 2 1 2.0 2 3 2 1 2.0 3 1 1 2 1.0 4 2 1 2 2.0 5 3 1 2 2.0 6 4 2 2 NaN
原代码问题说明
你之前的groupby([df['user'], df['period']==1])会把数据拆分为**(用户, True)和(用户, False)**两组,transform后得到的是每组内的最大值,这和你想要的“匹配用户在period=1的固定分组”逻辑完全不符,因此无法得到正确结果。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

