首页 > 解决方案 > 二维数组到数据框列中的行

问题描述

我有一个 numpy.ndarray 如下所示:

x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)
labels = [1,0]
df = pd.DataFrame({"a":x,"labels":labels})
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-458-79198b72cdcb> in <module>()
      1 x = np.array([[1, 2, 3], [4, 5, 6]], np.int32).reshape(-1,1)
      2 labels = [1,0,1,0]
----> 3 df = pd.DataFrame({"a":x,"labels":labels})

4 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/construction.py in sanitize_array(data, index, dtype, copy, raise_cast_failure)
    480     elif subarr.ndim > 1:
    481         if isinstance(data, np.ndarray):
--> 482             raise Exception("Data must be 1-dimensional")
    483         else:
    484             subarr = com.asarray_tuplesafe(data, dtype=dtype)

Exception: Data must be 1-dimensional

我试图重塑 np.ndarray ,x.reshape(-1,1)但结果没有改变。ndarray x 中的每个列表都必须是数据框中的一行。我期望得到:

           a  labels
0  [1, 2, 3]       1
1  [4, 5, 6]       0

标签: pythonpandasnumpy

解决方案


问题在于,由于a是一个多维的同构数组,pandas 不知道如何将其拆分为几行。一般来说,pandas 不支持嵌入式结构。想想高维数组 as 的情况(3,4,2),应该如何处理?

请注意,数据框列是通过对pd.Series构造函数的单独调用创建的。通过直接尝试从 ndarray 构造一个系列,我们得到相同的显式错误:

pd.Series(x)
    ...
    480     elif subarr.ndim > 1:
    481         if isinstance(data, np.ndarray):
--> 482             raise Exception("Data must be 1-dimensional")
    483         else:
    484             subarr = com.asarray_tuplesafe(data, dtype=dtype)
Exception: Data must be 1-dimensional

因此,您必须将数组转换为可迭代的,其中每个值都是数据帧的一行。为此,您可以将 numpy 数组的值解压缩到单独的列表中:

df = pd.DataFrame({"a":[*x], "labels":labels}) # or .."a":list(x)..

print(df)
           a  labels
0  [1, 2, 3]       1
1  [4, 5, 6]       0

推荐阅读