列表到多维np数组的序列

时间:2018-08-15 15:37:36

标签: arrays pandas numpy

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

我需要将其转换为multidim 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:两者之间有什么区别?从技术上讲都是数组的数组...

1 个答案:

答案 0 :(得分:3)

您可以直接在df.A上使用str.split,并使用参数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是元素的一维数组,恰好也是一维数组。当您使用arr2构造values时,它将根据意向df.A.apply(lambda x: np.array(x.split(" ")))构造一维数组,而无需查看该意向中的类型。对于arr1,不同之处在于df.A.str.split(' ',expand=True)不是一个序列,而是一个数据帧,因此使用values将构造一个形状为(number of rows,nb of columns)的2D数组。在这两种情况下,您都使用values,但是实际上在一个意向单元格中有一个数组(按照您的方法创建)不会创建2D数组。

然后,如果您要访问任何元素(例如第一行的第二个元素),则可以通过arr1[0,1]进行操作,而arr2[0,1]会抛出错误,因为该结构不是2D数组,但是arr2[0][1]提供了很好的答案,因为您访问了[1]中第一个1D数组[0]的第二个元素arr2

我希望它能提供一些解释。