Сопоставление строк фрейма данных Pandas с массивом numpy

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

Вот изображение, которое показывает то, что я ищу: Сопоставление строк фрейма данных Pandas с массивом numpy

Я могу извлекать столбцы строк из фрейма данных на основе некоторых критериев поиска.

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

Но как мне сопоставить это с номером строки (индексы массива, а не индексы меток), который будет использоваться в качестве индекса массива в numpy (при условии одинаковой длины строки)?

stuffprime = array[?, ?]

Причина, по которой мне это нужно, заключается в том, что фрейм данных намного больше и полнее и содержит критерии поиска по столбцам, но массивы numpy - это подмножества, которые были извлечены и изменены ранее в конвейере (и в них нет таких же критериев поиска) . Мне нужно найти фрейм данных и извлечь эквивалентные данные из массивов numpy. В основном мне нужно соотносить определенные строки из фрейма данных с соответствующими строками массива numpy.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
2 176
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я считаю, что для позиций по именам отфильтрованных столбцов требуется 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]
stuff.rows вместо stuff.columns?
delrocco 22.07.2018 21:43

@delrocco - Нет, в пандах это stuff.index, stuff.rows в новых версиях панд не реализован (может быть, в некоторых старых, не уверен)

jezrael 22.07.2018 21:45

очень извините, все еще запутался ... Мне нужны строки 2 и 4 только из stuffprime (массив numpy, а не фрейм данных)

delrocco 22.07.2018 21:46

@delrocco - думаю нужен np.where(df['timestamp'] == dt)[0]

jezrael 22.07.2018 21:47

хорошо, я это вижу. Вы уверены, что эти значения [0 2] будут номерами строк, даже если столбец индекса кадра данных будет перемешан?

delrocco 22.07.2018 21:48

@delrocco - Конечно, попробуй.

jezrael 22.07.2018 21:49

большое спасибо! Я могу работать с этим, чтобы получить то, что мне действительно нужно сейчас, lol thx!

delrocco 22.07.2018 21:50

Я бы сопоставил индексы панд с указателями numpy:

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

Затем вы можете использовать словарь keys_dict для адресации элементов массива по индексу pandas: array[keys_dict[some_df_index], :]

Другие вопросы по теме