如何将含文本数据的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:
之前失败是因为缺少统一的二级索引,导致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 - 关于切片拼接:出现NaN是因为没有统一的行标识,
cumcount生成的索引能确保每个分组的行数完全对齐,避免缺失值。 - 关于手动设置列:手动构造列的方式容易出错,尤其当分组行数不一致时,利用pandas内置的重塑函数更稳定可靠。
内容的提问来源于stack exchange,提问作者Greg Williams
相关产品推荐
相关产品推荐

