如何将pandas宽格式DataFrame转换为指定结构的长格式DataFrame
解决方案
你要的转换需求本质是对原DataFrame的底层数值按行拆分重塑,用numpy的reshape方法就能一行搞定,性能和简洁度都拉满:
import pandas as pd import numpy as np df = pd.DataFrame( np.random.randn(2, 12) ) slice_sz = 6 # 核心转换代码 new_df = pd.DataFrame(df.to_numpy().reshape(-1, slice_sz))
你给出的示例数据跑这段代码输出完全符合预期:原2行12列的数组先按行展开为长度24的一维数组,再按每行6个元素重组成4行6列的结构,刚好匹配你要的顺序:第一行前6列、第一行后6列、第二行前6列、第二行后6列。
原代码报错原因
你出现大量NaN的问题来自两个错误:
- 切片逻辑错误:pandas的
iloc索引是左闭右开规则,你设置j = slice_sz - 1,写i:j会少取索引为j的列,应该直接写成i:i+slice_sz即可,不用单独计算j值。 - 列名对齐问题:你切分出来的第二个分片的列名还是原DataFrame的6-11,append的时候会按列名匹配新表,所以新行的0-5列全部是空值,只有6-11列有数据。如果要改原循环的话,每次切分后重置列名即可:
df_sliced.columns = range(slice_sz),但循环拼接的方式性能远低于直接用reshape的方案,不推荐使用。
内容的提问来源于stack exchange,提问作者doing_the_best_I_can
相关产品推荐
相关产品推荐

