如何将DataFrame中的嵌套二维数组展开为行?
解决方法
你的问题出在b列的元素是三维嵌套结构(外层多了一层数组/列表),直接用apply(pd.Series)会因为维度不兼容报错。我们可以通过两步操作快速实现你想要的展开效果:
1. 预处理列数据,降低嵌套层级
首先把a列的单层嵌套去掉,同时把b列的三维数组转换成二维的坐标列表:
# 处理a列:从[[x, y]]提取出[x, y] df['a'] = df['a'].apply(lambda x: x[0]) # 处理b列:从[[[x1,y1], [x2,y2], ...]]提取出[[x1,y1], [x2,y2], ...] df['b'] = df['b'].apply(lambda arr: arr[0].tolist())
2. 用explode展开成多行
pandas的explode方法可以把列中的列表元素拆分成单独的行,同时自动重复对应行的a值:
result_df = df.explode('b')
示例验证
假设你的原始数据是这样的:
import pandas as pd import numpy as np data = { 'a': [[35.6113, -95.855]], 'b': [np.array([[[36.028, -95.93], [36.10, -95.82], [36.154, -95.993]]])] } df = pd.DataFrame(data)
运行上面的代码后,result_df的输出就是你想要的格式:
a b 0 [35.6113, -95.855] [36.028, -95.93] 0 [35.6113, -95.855] [36.1, -95.82] 0 [35.6113, -95.855] [36.154, -95.993]
为什么原方法报错?
你之前尝试的df['b'].apply(pd.Series)要求输入是一维或二维的可迭代对象,但你的b列元素是三维数组(比如你给出的例子shape是(1, 20, 2)),三维结构无法直接映射成列,所以会抛出"必须为一维数组"的错误。先降维再展开就完美解决这个问题了。
内容的提问来源于stack exchange,提问作者No_body
相关产品推荐
相关产品推荐

