pd.DataFrame() 构造需注意数组维度与形状:二维数组按行生成列,一维数组默认单列,三维及以上报错;列名和索引须用 columns/index 参数显式指定;结构化数组需用 tolist() 或字典推导式转换,避免全入 object 类型。

直接用 pd.DataFrame() 构造函数就能转,但数组维度、列名、索引这些细节不处理好,DataFrame 很容易“歪掉”或报错。
为什么 pd.DataFrame(arr) 有时列数不对?
NumPy 数组的形状决定 DataFrame 的行/列方向:二维数组默认按行生成列(即 arr.shape[1] 变成列数),一维数组会变成单列 DataFrame。如果原数组是 (10, 3),结果就是 10 行 × 3 列;但要是 (3, 10),就变成 3 行 × 10 列——容易和预期相反。
- 检查
arr.ndim和arr.shape,确认是否需要先arr.T转置 - 一维数组如
np.array([1,2,3])传进去会生成 3 行 1 列,不是 1 行 3 列;要变一行,得用arr.reshape(1, -1) - 三维及以上数组会直接报
ValueError: Must pass 2-d input,必须先降维或展平
怎么给列加名字、指定索引?
靠 columns 和 index 参数最直接,不依赖数组自带属性(NumPy 数组本身没列名概念)。
-
pd.DataFrame(arr, columns=['A', 'B', 'C'])—— 列数必须和arr.shape[1]一致,否则报ValueError: Shape of passed values is X, indices imply Y -
pd.DataFrame(arr, index=['row1','row2'])—— 行数需匹配,不匹配会静默截断或填充NaN - 混合使用时,
columns控制列名,index控制行标签,互不影响
从结构化 NumPy 数组(dtype 是复合类型)转要注意什么?
结构化数组(比如 np.array([(1,'a'),(2,'b')], dtype=[('id',int),('name','U10')]))不能直接用 pd.DataFrame(arr),否则所有字段被塞进一列,类型变成 object。
- 正确做法是传入
pd.DataFrame(arr.tolist())或pd.DataFrame({name: arr[name] for name in arr.dtype.names}) - 前者简单但丢精度(比如
int64可能变int32),后者保留原始 dtype,推荐用于数值敏感场景 - 如果结构化数组含嵌套字段(如
dtype([('x', [('y', float)])])),tolist()会出错,必须手动展开
最常被忽略的是结构化数组的隐式类型退化——看着像能直接转,实际一执行就发现列全空或者全是 object,这时候得回头查 arr.dtype 是不是结构体。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











