如何为按日期和客户排序的DataFrame生成ActOwner列?
生成DataFrame的ActOwner列解决方案
解决思路
- 按客户分组,提取每个客户的原始所有者(即
Appear=1对应的Owner值) - 对比当前行
Owner与原始所有者、上一行Owner的关系,匹配规则生成标记值
代码实现
假设你的DataFrame已按日期和客户排序,命名为df,包含Customer、Appear、Owner列,代码如下:
import pandas as pd # 步骤1:为每个客户提取原始所有者 df['OriginalOwner'] = df.groupby('Customer')['Owner'].transform( lambda grp: grp[df.loc[grp.index, 'Appear'] == 1].iloc[0] ) # 步骤2:获取分组内上一行的Owner值 df['PrevOwner'] = df.groupby('Customer')['Owner'].shift(1) # 步骤3:按规则生成ActOwner列 # 初始默认标记为0(首次出现的原始所有者) df['ActOwner'] = 0 # 规则2:所有者变更(非首次出现,当前Owner≠上一行且≠原始所有者) df.loc[ (df['Appear'] != 1) & (df['Owner'] != df['PrevOwner']) & (df['Owner'] != df['OriginalOwner']), 'ActOwner' ] = 1 # 规则3:回到原始所有者(非首次出现,当前Owner=原始所有者且上一行≠原始所有者) df.loc[ (df['Appear'] != 1) & (df['Owner'] == df['OriginalOwner']) & (df['PrevOwner'] != df['OriginalOwner']), 'ActOwner' ] = 2 # 清理临时列(可选) df = df.drop(['OriginalOwner', 'PrevOwner'], axis=1)
规则匹配说明
- 标记0:直接对应
Appear=1的行,即客户首次出现的原始所有者 - 标记1:非首次出现时,所有者发生变更且未回到原始值
- 标记2:非首次出现时,所有者从其他值变回原始所有者
示例验证
输入示例数据:
| Customer | Appear | Owner | |----------|--------|-------| | A | 1 | Tom | | A | 0 | Tom | | A | 0 | Jerry | | A | 0 | Tom | | B | 1 | Alice | | B | 0 | Bob |
输出的ActOwner列结果:
| ActOwner | |----------| | 0 | | 0 | | 1 | | 2 | | 0 | | 1 |
完全符合规则要求。
内容的提问来源于stack exchange,提问作者haraujo
相关产品推荐
相关产品推荐

