我有一个熊猫数据帧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']....
第一:我该怎么做才能让我的daya变成第二种格式? 第二:实际上我对这两种数据结构之间的差异有点困惑。归根结底,多维数组就是数组的数组。从这个角度来看,这两个似乎是相同的结构。但我肯定我错过了什么
例如:
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和2之间的区别是什么?从技术上讲,这两个阵列都是阵列的阵列
您可以直接使用} 和参数
df.A
上的^{expand=True
进行操作,然后使用values
例如:使用您的方法,如果所有字符串包含相同数量的数字,您仍然可以使用^{} 获得相同的结果:
编辑:对于不同之处,我不确定我能解释得足够好,但我尝试了。让我们定义
首先,您可以注意到形状不同:
所以我想说的一个区别是
arr2
是一个1D元素数组,碰巧也是1D数组。当您使用values
构造arr2
时,它从序列df.A.apply(lambda x: np.array(x.split(" ")))
构造1D数组,而不查看该序列中的类型。对于arr1
,区别在于df.A.str.split(' ',expand=True)
不是序列而是数据帧,因此使用values
将构造一个形状为(number of rows,nb of columns)
的二维数组。在这两种情况下,您都使用了values
,但在序列的单元格中实际拥有一个数组(正如在您的方法中创建的那样)不会创建2D数组然后,如果您想要访问任何元素(例如第一行第二个元素),您可以通过
arr1[0,1]
来完成,而arr2[0,1]
将抛出一个错误,因为此结构不是2D数组,但是arr2[0][1]
给出了很好的答案,因为您访问了arr2
中第一个1D数组的第二个元素[1]
我希望它能给出一些解释
相关问题 更多 >
编程相关推荐