Как получить индекс строки и столбца для логического условия и применить указанный индекс к другому фрейму данных? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть 2 кадра данных, res_params и res_tStats. Столбцы и индекс идентичны в обоих фреймах данных. Только значения в каждой строке и столбце (эквивалентно "ячейкам" в Excel, если хотите) отличаются друг от друга.

Мне нужно получить индекс строк и столбцов из res_tStats фрейм данных, где abs(res_tStats) > 1.96, а затем применить форматирование к тому же индексу и строкам в фрейме данных res_params.

Что я сделал

# res_tStats is a NxM dataframe with shape (6, 4)
# res_params is a NXM dataframe with shape (6, 4)

idx_required = np.where(abs(res_tStats) > 1.96)

print(idx_required)
# output: array([0, 0, 0, 5, 5, 5, 5]), array([0, 2, 3, 0, 1, 2, 3]))

Пока все хорошо. Это дало мне правильные места для индекса, где abs(res_tStats) > 1.96. Следующие значения действительно значимы:

строка 0, столбец 0
строка 0, столбец 2
строка 0, столбец 3
строка 5, столбец 0
строка 5, столбец 1
строка 5, столбец 2
строка 5, столбец 3

Теперь, когда я применяю эти местоположения индекса к res_params, я ожидаю получить значения точно в тех же местоположениях индекса , Однако я не совсем понимаю.

Выполнение: res_params.iloc[idx_required] возвращает df формы (7, 7).

Я дважды проверил, применив idx_required к res_tStats, ожидая получить только значения> 1,96, однако этого не произошло.
res_tStats.iloc[idx_required] также возвращает df формы (7, 7) с некоторыми значениями внутри него, которые ниже 1,96

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Я предполагаю, что вам нужен один 1D массив или Серия с 5 ожидаемыми элементами вместе с их индексами.

Возможным способом было бы использование индексов столбцов и стекаем фрейм данных:

res_param.set_axis(range(len(res_param.columns)), axis=1, inplace=False).stack()[zip(*idx_required)]

Он должен дать вам серию с индексами в виде MultiIndex и соответствующими значениями.

0 голосов
/ 25 марта 2020

Проблема в том, что idx_required - это кортеж с индексами и столбцами, а .iloc выбирает их в виде перекрестного продукта, если вы пропустите кортеж.

Простое исправление:

res_params[np.abs(res_tStats)>1.96]

Возвращает фрейм данных со значениями res_params, где np.abs(res_tStats)>1.96 и NaN, где условие не выполняется.

Другой способ - получить список элементов следующим образом:

res_params.to_numpy()[idx_required]

Таким образом, вы получите список элементов без соответствующего индекса или столбца.

...