基于连续行生成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'])
期望输出
目标表格
| CustomerNr | Source | Target |
|---|---|---|
| 1001 | A | C |
| 1004 | D | NaN |
| 1005 | C | D |
| 1010 | A | D |
| 1010 | D | F |
对应代码形式
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
相关产品推荐
相关产品推荐

