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

基于连续行生成Source与Target列的Pandas数据处理需求

客户活动序列转换解决方案

问题描述

现有存储客户编号(CustomerNr)与活动(Activity)的Pandas DataFrame,需将同一客户的连续活动转换为**Source(前序活动)和Target(后续活动)**列:

  • 同一客户的连续活动两两配对,前序活动为Source,后续为Target
  • 若客户仅存在单个活动,则生成一行Target为NaN的记录

原始数据

import pandas as pd
import numpy as np

df = pd.DataFrame([[1001, 'A'], [1001,'C'], [1004, 'D'],[1005, 'C'], 
                   [1005,'D'], [1010, 'A'],[1010,'D'],[1010,'F']], columns=['CustomerNr','Activity'])

期望输出

目标表格

CustomerNrSourceTarget
1001AC
1004DNaN
1005CD
1010AD
1010DF

对应代码形式

result = pd.DataFrame([[1001, 'A','C'], [1004, 'D',np.nan],[1005, 'C','D'], 
                       [1010, 'A','D'],[1010,'D' ,'F']], columns=['CustomerNr','Source','Target'])

实现代码

# 1. 计算每个客户的活动数量
df['activity_count'] = df.groupby('CustomerNr')['Activity'].transform('count')

# 2. 为每个客户生成Target列(取下一个活动)
df['Target'] = df.groupby('CustomerNr')['Activity'].shift(-1)

# 3. 重命名原Activity列为Source
df = df.rename(columns={'Activity': 'Source'})

# 4. 筛选符合要求的行:保留有后续活动的行,或仅单个活动的行
result = df[(df['Target'].notna()) | (df['activity_count'] == 1)][['CustomerNr', 'Source', 'Target']].reset_index(drop=True)

# 查看结果
print(result)

内容的提问来源于stack exchange,提问作者j_90

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:05:17