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

如何在Pandas中透视DataFrame,将同一Person_ID合并为一行并生成可变列名?

Pandas实现按Person_ID聚合并生成带序号的事件列

原始数据

首先是你的原始DataFrame:

import pandas as pd

person_id =  [1,1,1,2,2,2,3,3,3,3]
subscription_id = [96,97,98,99,100,101,102,103,104,105]
kwart = [19,19,20,20,21,22,23,24,25,26]
kwart_2 = [20,20,21,22,21,22,23,23,25,27]
kwart_3 = [21,20,21,22,22,23,24,25,26,30]

s = {"Person_ID": person_id, "Subscription_ID": subscription_id, "Event1": kwart, "Event2": kwart_2, "Event3": kwart_3}
data = pd.DataFrame(data = s)

实现方案

可以通过分组加序号→转窄表→透视重命名的步骤实现需求,具体代码如下:

# 1. 给每个Person_ID的分组按Subscription_ID排序添加序号
data['seq'] = data.groupby('Person_ID')['Subscription_ID'].rank(method='first').astype(int)

# 2. 将多列Event转成键值对的窄表格式
melted_data = data.melt(
    id_vars=['Person_ID', 'seq'],
    value_vars=['Event1', 'Event2', 'Event3'],
    var_name='event_type',
    value_name='event_value'
)

# 3. 透视生成目标结构,并合并列名
result = melted_data.pivot(
    index='Person_ID',
    columns=['event_type', 'seq'],
    values='event_value'
)
# 重命名列,生成Event1_1、Event1_2这类格式
result.columns = [f'{event}_{num}' for event, num in result.columns]

# 4. 重置索引,让Person_ID作为普通列
result = result.reset_index()

说明

  • 步骤1的rank用来确保每个Person下的记录严格按照Subscription_ID的顺序生成序号,避免排序混乱;
  • melt操作是为了把原本分散的Event1/Event2/Event3列统一转换成键值对,方便后续透视聚合;
  • 透视时同时以事件类型和序号作为列维度,最后通过字符串拼接得到你需要的列名格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:27:49