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

如何将含文本数据的Pandas DataFrame重复行转为列?

解决方案:将文本型DataFrame从长格式转为宽格式

核心思路

先为每个INDEX_COL分组内的行生成统一序号,再通过pivot实现格式转换——由于每个序号+分组的组合唯一,无需额外聚合操作即可完成文本数据的映射。

完整代码

import pandas as pd

# 构造示例DataFrame
data = {
    'INDEX_COL': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
    'col1': ['Random Text', 'Some more random text', 'more stuff',
             'Blah', 'Blah, Blah', 'Yet more stuff',
             'erm', 'yup', 'whatever']
}
df = pd.DataFrame(data)

# 1. 为每个分组生成组内行号
df['group_row_id'] = df.groupby('INDEX_COL').cumcount()

# 2. 执行pivot转换
result = df.pivot(
    index='group_row_id',
    columns='INDEX_COL',
    values='col1'
).reset_index(drop=True)

# 3. 移除列的层级名称(可选,匹配目标格式)
result.columns.name = None

print(result)

执行后输出与目标格式完全一致:

A                          B               C
0  Random Text  Some more random text        more stuff
1         Blah           Blah, Blah  Yet more stuff
2          erm                  yup        whatever

针对你尝试方法的补充说明

  • 关于Pivot:无需手动添加冗余数值列,groupby.cumcount()生成的组内行号作为pivot的索引,就能保证文本数据无冲突映射,比你之前的思路更简洁。
  • 关于Unstack:如果想用unstack实现,需要先把group_row_id和INDEX_COL设为复合索引,再执行unstack:
    df['group_row_id'] = df.groupby('INDEX_COL').cumcount()
    result = df.set_index(['group_row_id', 'INDEX_COL'])['col1'].unstack()
    result = result.reset_index(drop=True)
    result.columns.name = None
    
    之前失败是因为缺少统一的二级索引,导致unstack后无法对齐行。
  • 关于切片拼接:出现NaN是因为没有统一的行标识,cumcount生成的索引能确保每个分组的行数完全对齐,避免缺失值。
  • 关于手动设置列:手动构造列的方式容易出错,尤其当分组行数不一致时,利用pandas内置的重塑函数更稳定可靠。

内容的提问来源于stack exchange,提问作者Greg Williams

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 18:05:17