如何在Python中正确拆分或重塑数据集为宽格式?
问题描述
我有如下初始数据集:
| 列A | 列B | 列C |
|---|---|---|
| 客户1 | xxxxxx | ppppp |
| 客户1 | yyyyyy | ppppp |
| 客户1 | zzzzzz | uuuuu |
| 客户2 | aaaaaa | |
| 客户3 | bbbbb | |
| 客户3 | cccccc | ddddd |
希望转换为如下格式:
| 列A | 列B | 列C | 列B2 | 列C2 | 列B3 | 列C3 |
|---|---|---|---|---|---|---|
| 客户1 | xxxxxx | ppppp | yyyyyy | ppppp | zzzzzz | uuuuu |
| 客户2 | aaaaaa | |||||
| 客户3 | bbbbb | cccccc | ddddd |
请问如何在Python中实现这一数据集的拆分或重塑操作?
实现方法
可以用Python的pandas库完成这个数据重塑操作,核心思路是先为每个客户的分组添加行序号,再将长格式数据转成宽格式。
步骤1:导入库并加载数据
先准备初始数据,这里用字典模拟,实际场景也可以从CSV/Excel等文件读取:
import pandas as pd data = { '列A': ['客户1', '客户1', '客户1', '客户2', '客户3', '客户3'], '列B': ['xxxxxx', 'yyyyyy', 'zzzzzz', 'aaaaaa', '', 'cccccc'], '列C': ['ppppp', 'ppppp', 'uuuuu', '', 'bbbbb', 'ddddd'] } df = pd.DataFrame(data)
步骤2:为分组添加行序号
按列A分组,给每个客户下的行标记序号,区分同一客户的不同记录:
df['序号'] = df.groupby('列A').cumcount() + 1
执行后,客户1的三行分别标记1、2、3,客户2标记1,客户3标记1、2。
步骤3:转换为宽格式
用pivot方法将长数据转成宽数据,再整理列名:
# 转宽格式 pivoted_df = df.pivot(index='列A', columns='序号', values=['列B', '列C']) # 合并多层列名,生成列B2、列C2这类命名 pivoted_df.columns = [f'{col[0]}{col[1]}' if col[1] > 1 else col[0] for col in pivoted_df.columns] # 把列A从索引转回普通列,补全缺失值为空字符串 pivoted_df = pivoted_df.reset_index().fillna('')
步骤4:调整列顺序(可选)
如果需要和目标表格的列顺序完全匹配,手动指定列顺序即可:
final_columns = ['列A', '列B', '列C', '列B2', '列C2', '列B3', '列C3'] pivoted_df = pivoted_df[final_columns]
运行以上代码后,pivoted_df就是符合需求的数据集。
内容的提问来源于stack exchange,提问作者NA89
相关产品推荐
相关产品推荐

