将Pandas数据框的行映射到numpy数组

时间:2018-07-22 19:27:06

标签: python arrays pandas numpy

对不起,我知道有很多与索引相关的问题,很可能让我无所适从,但是我对此有些麻烦。我熟悉.loc.iloc.index方法和切片。方法.reset_index可能尚未(也可能无法)在我们的数据帧上调用,因此索引标签可能不正确。数据框和numpy数组实际上是数据框的长度不同的子集,但在本示例中,我将保持它们的大小相同(一旦有了示例,我就可以处理偏移量)。

这里是一张图片,显示我在寻找什么: enter image description here

我可以根据一些搜索条件从数据框中提取行的列。

idxlbls = df.index[df['timestamp'] == dt]
stuff = df.loc[idxlbls, 'col3':'col5']

但是如何将其映射到行号(数组索引,而不是标签索引)以用作numpy中的数组索引(假设行长度相同)?

stuffprime = array[?, ?]

我需要它的原因是因为数据帧更大且更完整,并且包含列搜索条件,但是numpy数组是在管道中事先提取和修改的子集(并且没有相同的搜索条件)在他们之中)。我需要搜索数据框并从numpy数组中提取等效数据。基本上,我需要将数据帧中的特定行与numpy数组的相应行相关联。

2 个答案:

答案 0 :(得分:1)

我会将熊猫指数映射到numpy索引:

keys_dict = dict(zip(idxlbls, range(len(idxlbls))))

然后,您可以使用字典keys_dict通过熊猫索引array[keys_dict[some_df_index], :]

来寻址数组元素。

答案 1 :(得分:0)

我相信过滤后的列名称需要get_indexer,对于位置的索引也可以使用相同的方式,对于布尔掩码,numpy.where可以用于位置:

df = pd.DataFrame({'timestamp':list('abadef'),
                   'B':[4,5,4,5,5,4],
                   'C':[7,8,9,4,2,3],
                   'D':[1,3,5,7,1,0],
                   'E':[5,3,6,9,2,4]}, index=list('ABCDEF'))

print (df)
  timestamp  B  C  D  E
A         a  4  7  1  5
B         b  5  8  3  3
C         a  4  9  5  6
D         d  5  4  7  9
E         e  5  2  1  2
F         f  4  3  0  4

idxlbls = df.index[df['timestamp'] == 'a']
stuff = df.loc[idxlbls, 'C':'E']
print (stuff)
   C  D  E
A  7  1  5
C  9  5  6

a = df.index.get_indexer(stuff.index)

或通过布尔掩码获取职位:

a = np.where(df['timestamp'] == 'a')[0]

print (a)
[0 2]

b = df.columns.get_indexer(stuff.columns)
print (b)
[2 3 4]