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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:09:24