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

如何为按日期和客户排序的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)

规则匹配说明

  1. 标记0:直接对应Appear=1的行,即客户首次出现的原始所有者
  2. 标记1:非首次出现时,所有者发生变更且未回到原始值
  3. 标记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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:22:22