python - 一系列列表到多维 np 数组

标签 python arrays pandas numpy

我有一个 pandas 数据框 df。 一列是一串数字(作为字符)除以空格

我需要将其转换为多维 numpy 数组。

我认为:

df.A.apply(lambda x: np.array(x.split(" "))).values

会成功的

实际上它返回一个数组的数组......

array([array(['70', '80', '82', ..., '106', '109', '82'], dtype='<U3'),
   array(['151', '150', '147', ..., '193', '183', '184'], dtype='<U3'),

这似乎不是我所寻找的,而应该看起来像

array([[[['70', '80', '82', ..., '106', '109', '82'],['151', '150', '147', ..., '193', '183', '184']....

第一:我应该怎么做才能让我的日子变成第二种格式? 第二:我实际上对这两种数据结构之间的区别有点困惑。归根结底,多维数组是数组的数组。从这个角度来看,两者似乎是相同的结构。但我确信我错过了一些东西

示例:

df=pd.DataFrame({"A":[0,1,2,3],"B":["1 2 3 4","5 6 7 8","9 10 11 12","13 14 15 16"]})

    A   B
0   0   "1 2 3 4"
1   1   "5 6 7 8"
2   2   "9 10 11 12"
3   3   "13 14 15 16"

这个命令

df.B.apply(lambda x: np.array(x.split(" "))).values

给出:

array([array(['1', '2', '3', '4'], dtype='<U1'),
   array(['5', '6', '7', '8'], dtype='<U1'),
   array(['9', '10', '11', '12'], dtype='<U2'),
   array(['13', '14', '15', '16'], dtype='<U2')], dtype=object)

而不是

 array([['1', '2', '3', '4'],
   ['5', '6', '7', '8'],
   ['9', '10', '11', '12'],
   ['13', '14', '15', '16']], dtype='<U2')

问题1:如何获得最后一个结构? 问题2:2者有什么区别?从技术上讲,两者都是数组的数组...

最佳答案

你可以使用str.split来做到这一点直接在 df.A 上,使用参数 expand=True,然后使用 values,例如:

df = pd.DataFrame({'A':['70 80 82','151 150 147']})
print (df.A.str.split(' ',expand=True).values)
array([['70', '80', '82'],
       ['151', '150', '147']], dtype=object)

使用您的方法,如果所有字符串包含相同数量的数字,您仍然可以使用 np.stack得到相同的结果:

print (np.stack(df.A.apply(lambda x: np.array(x.split(" "))).values))

编辑:对于差异,不确定我能否解释得足够好,但我会尝试。让我们定义一下

arr1 = df.A.str.split(' ',expand=True).values
arr2 = df.A.apply(lambda x: np.array(x.split(" "))).values

首先你会注意到形状不一样:

print(arr1.shape)
(2, 3)
print(arr2.shape)
(2,)

所以我想说,一个区别是 arr2 是一个一维元素数组,而它恰好也是一维数组。当您使用 values 构造 arr2 时,它会从系列 df.A.apply(lambda x: np.array(x.split(""))) 无需查看本系列中的类型。对于 arr1 ,区别在于 df.A.str.split(' ',expand=True) 不是一个系列而是一个数据帧,因此使用 values 将构造一个形状为(行数,nb 列) 的二维数组。在这两种情况下,您都使用 values,但实际上在系列的单元格中拥有一个数组(如在您的方法中创建的)不会创建二维数组。

然后,如果您想访问任何元素(例如第一行第二个元素),您可以通过 arr1[0,1] while arr2[0,1] 会抛出错误,因为该结构不是二维数组,但 arr2[0][1] 给出了很好的答案,因为您访问了第二个元素 [1] arr2 中第一个一维数组 [0] 的 >。

我希望它能给出一些解释。

关于python - 一系列列表到多维 np 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51861904/

相关文章:

php - 划分 foreach 不能正常工作

java - 希望使用 Java 创建随机数组

java - 我如何才能到达 Boat object removee 仅将最近添加的项目打印到 "removed"数组的位置

python - 计算具有非唯一日期索引的数据帧的滚动中位数

python - 更改 df 的格式并删除不需要的字符

python - 如果 Pandas 有公共(public)键,它们会将行中的某些值转换为列

python - 你能解释一下为什么改变类的函数属性会产生以下效果吗?

python - 批处理 numpy 数组索引

python - Google Cloud Composer BigQuery Operator - 获取作业 API HTTPError 404

python - 为什么我在 Python 的一致性程序中得到 'dict' has no attribute 'sort' 错误