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

У меня есть следующие фреймы данных site_1_df и `site_2_df (оба похожи):

site_1_df:

enter image description here

И следующий фрейм данных:

site_1_index_df = pd.DataFrame(site_1_df.index.values.tolist(), columns=["SiteNumber", "WeekNumber", "PG"])
site_2_index_df = pd.DataFrame(site_2_df.index.values.tolist(), columns=["SiteNumber", "WeekNumber", "PG"])
index_intersection = pd.merge(left=site_1_index_df, right=site_2_index_df, 
                              on=["WeekNumber", "PG"], how="inner")[["WeekNumber", "PG"]]

index_intersection:

enter image description here

Следовательно, ясно, что site_1_df и site_2_df - это многоуровневые индексированные кадры данных. Поэтому я хотел бы использовать index_intersection для индексации вышеуказанного кадра данных. Или, если я индексирую из site_1_df, я хочу подмножество строк в одном и том же кадре данных. И технически я должен вернуть фрейм данных, который имеет (8556 строк x 6 столбцов), то есть такое же количество строк index_intersection. Как я могу добиться этого эффективно в pandas?

Я пытался:

index_intersection = pd.merge(left=site_1_index_df, right=site_2_index_df, 
                              on=["WeekNumber", "PG"], how="inner")[["SiteNumber_x", "WeekNumber", "PG"]]

index_intersection = index_intersection.rename(columns={"SiteNumber_x": "SiteNumber"})

index_intersection = index_intersection.set_index(["SiteNumber", "WeekNumber", "PG"])
index_intersection

И я получил:

enter image description here

Однако, индексирование информационного кадра с использованием другого информационного кадра, такого как:

site_2_df.loc[index_intersection]
# or
site_2_df.loc[index_intersection.index]
# or
site_2_df.loc[index_intersection.index.values]

, выдаст мне ошибку:

NotImplementedError: Indexing a MultiIndex with a DataFrame key is not implemented

Любая помощь очень ценится !!

1 Ответ

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

Итак, я понял, что могу найти пересечение 2-х фреймов данных, основываясь на их индексе:

sites_common_rows = pd.merge(left=site_1_df.reset_index([0]), right=site_2_df.reset_index([0]), 
                                 left_index=True, right_index=True, how="inner")

Выше reset_index([0]) используется для игнорирования SiteNumber, поскольку это полностью отличается от одного фрейма данных другому. Следовательно, я могу найти внутреннее соединение между двумя фреймами данных по их индексам.

...