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

如何在Python中将多行DataFrame转换为多列紧凑格式

在Python中实现DataFrame的行转列紧凑格式转换

需求说明

将同一#分组的多行数据合并为单行,依次排列每组内的C1和C2值,生成新的连续列C3、C4等。

原始数据结构

#C1C2
a110%
a211.1%
a38%
b17%
b213.1%
b36%

目标数据结构

#C1C2C3C4C5C6
a110%211.1%38%
b17%213.1%36%

解决方案(使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:44:58