Python 访问元组的numpy数组中的第一个项

Python 访问元组的numpy数组中的第一个项,python,arrays,numpy,pandas,dataframe,Python,Arrays,Numpy,Pandas,Dataframe,我有一个pandas数据框架,它有一个包含由两个浮点数组成的元组的列,例如(1.1,2.2)。我希望能够生成一个数组,其中包含每个元组的第一个元素。我可以一步一步地遍历每一行,得到每个元组的第一个元素,但dataframe包含近400万条记录,这种方法非常慢。satoru对SO的回答(stackoverflow.com/questions/6454894/reference-An-element-in-a-list-of-tuples)建议使用以下机制: >>> import

我有一个pandas数据框架,它有一个包含由两个浮点数组成的元组的列,例如(1.1,2.2)。我希望能够生成一个数组,其中包含每个元组的第一个元素。我可以一步一步地遍历每一行,得到每个元组的第一个元素,但dataframe包含近400万条记录,这种方法非常慢。satoru对SO的回答(stackoverflow.com/questions/6454894/reference-An-element-in-a-list-of-tuples)建议使用以下机制:

>>> import numpy as np
>>> arr = np.array([(1.1,2.2),(3.3,4.4),(5.5,6.6),(7.7,8.8)])
>>> arr
array([[ 1.1,  2.2],
       [ 3.3,  4.4],
       [ 5.5,  6.6],
       [ 7.7,  8.8]])
>>> arr[:,0]
array([ 1.1,  3.3,  5.5,  7.7])
这样做很好,完全符合我的需要。但是,当我尝试从数据帧创建numpy数组时,就会出现问题。在这种情况下,上述解决方案会失败,并出现各种错误。例如:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'other':[0,0,0,1,1],'point':[(1.1,2.2),(3.3,4.4),(5.5,6.6),(7.7,8.8),(9.9,0.0)]})
>>> df
   other       point
0      0  (1.1, 2.2)
1      0  (3.3, 4.4)
2      0  (5.5, 6.6)
3      1  (7.7, 8.8)
4      1  (9.9, 0.0)
>>> arr2 = np.array(df['point'])
>>> arr2
array([(1.1, 2.2), (3.3, 4.4), (5.5, 6.6), (7.7, 8.8), (9.9, 0.0)], dtype=object)
>>> arr2[:,0]
IndexError: too many indices for array
或者:

>>> arr2 = np.array([df['point']])
>>> arr2
array([[[1.1, 2.2],
        [3.3, 4.4],
        [5.5, 6.6],
        [7.7, 8.8],
        [9.9, 0.0]]], dtype=object)
>>> arr2[:,0]
array([[1.1, 2.2]], dtype=object)   # Which is not what I want!

当我将数据从pandas数据帧传输到numpy数组时,似乎出现了一些问题,但我不知道会发生什么。如果您有任何建议,我们将不胜感激。

从您的数据帧开始,我可以提取一个
(5,2)
数组,其中包括:

import numpy as np
import pandas as pd
df = pd.DataFrame({'other':[0,0,0,1,1],'point':[(1.1,2.2),(3.3,4.4),(5.5,6.6),(7.7,8.8),(9.9,0.0)]})
array = df['point'].apply(lambda x: x[0]).values
array
# array([ 1.1,  3.3,  5.5,  7.7,  9.9])
In [68]: df=pandas.DataFrame({'other':[0,0,0,1,1],'point':[(1.1,2.2),(3.3,4.4),(5.5,6.6),(7.7,8.8),(9.9,0.0)]})

In [69]: np.array(df['point'].tolist())
Out[69]: 
array([[ 1.1,  2.2],
       [ 3.3,  4.4],
       [ 5.5,  6.6],
       [ 7.7,  8.8],
       [ 9.9,  0. ]])
df['point']
是一个熊猫系列

df['point'].values
返回形状数组
(5、)
,以及数据类型
对象
。我

array([(1.1, 2.2), (3.3, 4.4), (5.5, 6.6), (7.7, 8.8), (9.9, 0.0)], dtype=object)
实际上,它是一个元组数组。真正的元组,而不是结构数组tuple-look-a-likes。数组实际上包含指向元组的指针,元组在内存中的其他位置。它的形状是
(5,)
-它是一个1d数组,因此尝试将其作为2d进行索引会出现“太多”错误
np.array([df['point']])
只是将其包装在另一个维度中,而没有解决基本的对象数据类型问题

tolist()
将其转换为元组列表,从中可以构建二维数组


将数据从对象数组复制到n-d数组并不是一件小事,而且总是需要某种形式的复制。数据缓冲区是完全不同的,所以像
astype
这样的东西不起作用。

感谢您的解决方案。这肯定会产生预期的产出。但是,它并没有真正解决为什么将数据帧中的数据导入numpy数组不起作用的问题。非常清楚和简洁的解释-非常感谢。