python - 二维数组到数据框列中的行
问题描述
我有一个 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
解决方案
问题在于,由于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
推荐阅读
- javascript - 将json中的文件上传到服务器
- python - python文件的seek方法的机制是什么?
- google-chrome-extension - 无法通过 content.js 和 background.js 进行通信,在我禁用扩展后,然后在 chrome 扩展中启用它
- java - SQLite 查询案例中的单引号字符和通配符 SQLiteException
- excel - 如何使用excel vba根据货币标准格式化列中的数字?
- laravel - 我的联系我们不起作用
- android - 删除后仍显示在 recyclerView 中的项目
- scala - 有条件地合并序列中的项目
- azure - Azure AD 来宾用户多重身份验证
- apache-spark - 仅从一个数据帧 spark 中删除重复项