Извините, я знаю, что есть так много вопросов, связанных с индексированием, и, вероятно, это ставит меня в лицо, но у меня с этим возникают небольшие проблемы. Я знаком с методами .loc, .iloc и .index и с нарезкой в целом. Метод .reset_index, возможно, не был (и не может быть) вызван в нашем фрейме данных, и поэтому индексные метки могут быть не в порядке. Фрейм данных и массив (ы) numpy на самом деле представляют собой подмножества фрейма данных разной длины, но для этого примера я сохраню их одного и того же размера (я могу справиться со смещением, когда у меня будет пример).
Вот изображение, которое показывает то, что я ищу:

Я могу извлекать столбцы строк из фрейма данных на основе некоторых критериев поиска.
idxlbls = df.index[df['timestamp'] == dt]
stuff = df.loc[idxlbls, 'col3':'col5']
Но как мне сопоставить это с номером строки (индексы массива, а не индексы меток), который будет использоваться в качестве индекса массива в numpy (при условии одинаковой длины строки)?
stuffprime = array[?, ?]
Причина, по которой мне это нужно, заключается в том, что фрейм данных намного больше и полнее и содержит критерии поиска по столбцам, но массивы numpy - это подмножества, которые были извлечены и изменены ранее в конвейере (и в них нет таких же критериев поиска) . Мне нужно найти фрейм данных и извлечь эквивалентные данные из массивов numpy. В основном мне нужно соотносить определенные строки из фрейма данных с соответствующими строками массива numpy.






Я считаю, что для позиций по именам отфильтрованных столбцов требуется 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]
@delrocco - Нет, в пандах это stuff.index, stuff.rows в новых версиях панд не реализован (может быть, в некоторых старых, не уверен)
очень извините, все еще запутался ... Мне нужны строки 2 и 4 только из stuffprime (массив numpy, а не фрейм данных)
@delrocco - думаю нужен np.where(df['timestamp'] == dt)[0]
хорошо, я это вижу. Вы уверены, что эти значения [0 2] будут номерами строк, даже если столбец индекса кадра данных будет перемешан?
@delrocco - Конечно, попробуй.
большое спасибо! Я могу работать с этим, чтобы получить то, что мне действительно нужно сейчас, lol thx!
Я бы сопоставил индексы панд с указателями numpy:
keys_dict = dict(zip(idxlbls, range(len(idxlbls))))
Затем вы можете использовать словарь keys_dict для адресации элементов массива по индексу pandas: array[keys_dict[some_df_index], :]
stuff.rowsвместоstuff.columns?