如何在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
相关产品推荐
相关产品推荐

