Pandas如何对按6行分组重复Field列的DataFrame执行unstack操作
pandas实现固定周期行转列(unstack)方案
不需要逐行迭代追加,用pandas原生的向量化方法就能快速实现,性能远好于循环写法。
实现思路
你的数据规律是每6行为一个重复单元,同一单元内Field列固定按a→f取值,对应结果里的一行。只要先给每一行打上所属的组编号,再通过透视/反堆叠操作转成宽表即可。
完整代码示例
首先构造测试数据(多组重复结构方便验证效果):
import pandas as pd # 构造3组重复的测试数据,和你给出的示例结构一致 example_df = pd.DataFrame({ 'Field': ['a','b','c','d','e','f']*3, 'Value': ['A',1,3,2,3,1, 'B',2,4,1,5,0, 'C',9,8,7,6,5] })
核心转换代码,两种写法效果完全一致:
# 步骤1:按每6行一组,给每行分配组ID,从0开始递增 example_df['group_id'] = example_df.index // 6 # 写法1:用pivot直接透视,最直观 result = example_df.pivot( index='group_id', columns='Field', values='Value' ).reset_index(drop=True) # 去掉组ID索引,得到从0开始的默认行号 # 写法2:用set_index+unstack实现,就是你要的反堆叠逻辑 # result = example_df.set_index(['group_id', 'Field'])['Value'].unstack().reset_index(drop=True)
转换效果
运行后输出的result完全匹配你期望的格式:
Field a b c d e f 0 A 1 3 2 3 1 1 B 2 4 1 5 0 2 C 9 8 7 6 5
补充说明
- 该方法是pandas原生向量化实现,数据量越大,相比逐行循环的性能优势越明显
- 如果后续每组的行数变化,只需要修改
//后的分组长度数值即可,比如每组7行就写example_df.index //7 - 即使同一组内
Field的取值顺序偶尔错乱,透视逻辑也会自动按字段名对齐列,不会出现值错位的问题
内容的提问来源于stack exchange,提问作者ml4irs
相关产品推荐
相关产品推荐

