如何将5×3的Pandas DataFrame转换为15×1格式?
高效实现多列DataFrame转单列堆叠
针对你需要将多列DataFrame按列顺序堆叠成单列的需求,完全不需要多次调用append,这里有几种简洁且高效的实现方式,尤其适合数十列的场景:
方法1:一行搞定的stack()
这是最简洁的写法,利用Pandas的层级索引转换能力,直接将所有列按顺序堆叠:
import pandas as pd # 构造示例数据 df = pd.DataFrame([ [1,2,3], [4,5,6], [7,8,9], [10,11,12], [13,14,15] ]) # 转换为单列DataFrame single_col_df = df.stack().reset_index(drop=True).to_frame()
stack()会把每一列的元素依次转到行维度,生成带层级索引的Series,reset_index(drop=True)用来移除多余的层级索引,最后to_frame()可以把Series转回DataFrame格式。
方法2:灵活可控的pd.concat()
如果需要更明确地控制列的拼接顺序(比如自定义堆叠顺序),可以用pd.concat遍历列进行拼接:
# 按指定列顺序拼接所有列 single_col_df = pd.concat([df[col] for col in df.columns], ignore_index=True).to_frame()
这种方式通过列表推导式遍历所有列,把每一列作为单独的Series传入pd.concat,ignore_index=True确保最终的索引是连续递增的。
方法3:通用型的melt()
melt是Pandas处理宽表转长表的通用方法,也能实现这个需求:
# 转换后提取值列并重置索引 single_col_df = df.melt(value_name='data')['data'].reset_index(drop=True).to_frame()
melt会把所有列转为"变量-值"的结构,我们只需要提取值列即可得到目标单列数据。
性能说明
多次调用append的方式效率极低,因为每次append都会生成新的DataFrame,频繁的内存操作会导致处理大量列时速度骤降。上述三种方法都是批量操作,其中stack()的性能最优、代码最简洁;pd.concat()在需要自定义列顺序时更灵活。
内容的提问来源于stack exchange,提问作者Tim Starr
相关产品推荐
相关产品推荐

