对不起,我知道有很多与索引相关的问题,很可能让我无所适从,但是我对此有些麻烦。我熟悉.loc
,.iloc
和.index
方法和切片。方法.reset_index
可能尚未(也可能无法)在我们的数据帧上调用,因此索引标签可能不正确。数据框和numpy数组实际上是数据框的长度不同的子集,但在本示例中,我将保持它们的大小相同(一旦有了示例,我就可以处理偏移量)。
我可以根据一些搜索条件从数据框中提取行的列。
idxlbls = df.index[df['timestamp'] == dt]
stuff = df.loc[idxlbls, 'col3':'col5']
但是如何将其映射到行号(数组索引,而不是标签索引)以用作numpy中的数组索引(假设行长度相同)?
stuffprime = array[?, ?]
我需要它的原因是因为数据帧更大且更完整,并且包含列搜索条件,但是numpy数组是在管道中事先提取和修改的子集(并且没有相同的搜索条件)在他们之中)。我需要搜索数据框并从numpy数组中提取等效数据。基本上,我需要将数据帧中的特定行与numpy数组的相应行相关联。
答案 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]