如何将Pandas DataFrame的列拼接为一维数组?
实现DataFrame列的一维拼接(全列/部分列)
一、拼接全部列成一维数组
给你两种简洁高效的方法,不用手动列列名:
- 方法1:numpy按列展平
把DataFrame转成numpy数组后,用ravel('F')按列优先顺序展平('F'对应Fortran顺序,即先取完第一列所有元素,再取第二列,以此类推):
import pandas as pd import numpy as np # 示例DataFrame df = pd.DataFrame({'set1': [3,4], 'set2': [5,8], 'set3': [6,0], 'set175': [9,22]}) # 全列拼接为一维数组 full_concat = df.to_numpy().ravel('F') # 输出结果:array([ 3, 4, 5, 8, 6, 0, 9, 22])
老版本里用df.values.ravel('F')也能得到同样结果。
- 方法2:pandas stack方法
stack()会将列索引转为内层行索引,生成一个Series,直接取values就能得到一维数组:
full_concat = df.stack().values
结果和上面完全一致,这种方法不需要额外依赖numpy。
二、拼接指定范围的列(比如第1-3列)
先筛选出目标列,再复用上面的方法即可:
- 按列位置筛选:pandas列位置从0开始,第1到3列对应索引
0:3(左闭右开):
# 筛选第1-3列(对应示例中的set1、set2、set3) partial_df = df.iloc[:, 0:3] # 拼接为一维数组 partial_concat = partial_df.to_numpy().ravel('F') # 输出结果:array([3,4,5,8,6,0])
- 按列名范围筛选:如果列名是连续命名的(比如
set1到set3),可以直接用列名切片:
partial_df = df.loc[:, 'set1':'set3'] partial_concat = partial_df.stack().values
三、是否需要转numpy数组?
两种思路都可行:
- 转numpy的方法(
to_numpy().ravel('F'))效率更高,适合数百列的大数据集; - 纯pandas方法(
stack().values)更直观,不需要引入numpy,最终结果同样是numpy数组(Series的values属性本身就是numpy数组)。
内容的提问来源于stack exchange,提问作者inteface
相关产品推荐
相关产品推荐

