如何在Python中将多行DataFrame转换为多列紧凑格式
在Python中实现DataFrame的行转列紧凑格式转换
需求说明
将同一#分组的多行数据合并为单行,依次排列每组内的C1和C2值,生成新的连续列C3、C4等。
原始数据结构
| # | C1 | C2 |
|---|---|---|
| a | 1 | 10% |
| a | 2 | 11.1% |
| a | 3 | 8% |
| b | 1 | 7% |
| b | 2 | 13.1% |
| b | 3 | 6% |
目标数据结构
| # | C1 | C2 | C3 | C4 | C5 | C6 |
|---|---|---|---|---|---|---|
| a | 1 | 10% | 2 | 11.1% | 3 | 8% |
| b | 1 | 7% | 2 | 13.1% | 3 | 6% |
解决方案(使用Pandas)
通过分组计数、索引重塑和列重命名三步即可实现:
1. 准备示例数据
import pandas as pd # 构建原始DataFrame df = pd.DataFrame({ '#': ['a', 'a', 'a', 'b', 'b', 'b'], 'C1': [1, 2, 3, 1, 2, 3], 'C2': ['10%', '11.1%', '8%', '7%', '13.1%', '6%'] })
2. 转换代码
# 为每个分组内的行添加序号,区分同一分组的不同行 df['seq'] = df.groupby('#').cumcount() # 重塑数据:将分组内的行转为列 df_unstacked = df.set_index(['#', 'seq']).unstack() # 重命名多级列,生成连续的C1/C2/C3...列名 df_unstacked.columns = [f'C{1 + 2*i + j}' for i in range(df_unstacked.columns.nlevels//2) for j in range(2)] # 将#从索引转回普通列,得到最终结果 result = df_unstacked.reset_index() # 查看结果 print(result)
代码解释
groupby('#').cumcount():对每个#分组内的行计数,生成从0开始的序号,标记同一分组内的不同行。set_index(['#', 'seq']).unstack():设置#和seq为多级索引,将seq层级的行转换为列,此时列呈现多级结构(如('C1', 0)、('C2', 0))。- 列重命名:通过列表推导式将多级列名转换为连续的
C1、C2、C3...格式,匹配目标结构。 reset_index():将#列从索引恢复为普通列,得到紧凑格式的最终DataFrame。
内容的提问来源于stack exchange,提问作者van dam
相关产品推荐
相关产品推荐

