如何用Python的Pandas将多行重复数据转换为多列格式?
用Pandas实现多行合并为单行的解决方案
输入数据
| Object | ID | Ticket | Description |
|---|---|---|---|
| ob1 | 88 | ticket1 | information ticket1 |
| ob1 | 88 | ticket2 | information ticket2 |
期望输出数据
| Object | ID | Ticket | Description | Ticket | Description |
|---|---|---|---|---|---|
| ob1 | 88 | ticket1 | information ticket1 | ticket2 | information ticket2 |
实现思路
核心是按重复的Object和ID分组,将每组内的Ticket和Description分别整理为列表,再将列表横向展开为多列,最后重组数据框。
示例代码
import pandas as pd # 构造输入数据 df = pd.DataFrame({ 'Object': ['ob1', 'ob1'], 'ID': [88, 88], 'Ticket': ['ticket1', 'ticket2'], 'Description': ['information ticket1', 'information ticket2'] }) # 按Object和ID分组,收集Ticket和Description为列表 grouped = df.groupby(['Object', 'ID']).agg({ 'Ticket': list, 'Description': list }).reset_index() # 将列表展开为多列,并重新命名列名 def expand_list_columns(df, col_name): expanded = pd.DataFrame(df[col_name].tolist(), index=df.index) expanded.columns = [f'{col_name}_{i+1}' for i in expanded.columns] return expanded expanded_tickets = expand_list_columns(grouped, 'Ticket') expended_descriptions = expand_list_columns(grouped, 'Description') # 合并所有列 result = pd.concat([grouped[['Object', 'ID']], expanded_tickets, expended_descriptions], axis=1) # 可选:重命名列名匹配期望输出的无序号格式 result.columns = ['Object', 'ID', 'Ticket', 'Description', 'Ticket', 'Description'] print(result)
代码说明
- 分组收集:用
groupby结合agg(list)把每组的票号和描述打包成列表,确保同一组的相关数据被聚合到一起。 - 列表展开:自定义函数将列表列拆分为多个独立列,自动生成带序号的列名(也可以手动修改为无序号)。
- 列合并:将分组后的基础列和展开后的列横向拼接,得到最终的单行结构。
原代码问题说明
你之前用的pivot_table思路不符合需求:
columns参数设置为['Description','Ticket Number']会生成多级列,但不是横向合并的效果aggfunc='count'是统计计数,而非收集原始值,无法得到目标内容
内容的提问来源于stack exchange,提问作者Rachel Ps
相关产品推荐
相关产品推荐

