首页 > 解决方案 > 如何使用一个数据框的内容来索引另一个多级索引数据框?

问题描述

我有以下数据site_1_df框和`site_2_df(两者相似):

site_1_df

在此处输入图像描述

以及以下数据框:

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

在此处输入图像描述

因此,很明显site_1_dfsite_2_df是多级索引数据帧。因此,我想使用index_intersection来索引上述数据框。或者,如果我从 site_1_df 建立索引,那么我想要来自同一数据帧的行的子集。从技术上讲,我应该取回一个具有(8556 行 x 6 列)的数据框,即 index_intersection 的行数相同。我怎样才能在熊猫中有效地实现这一目标?

我试过了:

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

我得到了:

在此处输入图像描述

但是,使用另一个数据帧索引数据帧,例如:

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

任何帮助深表感谢!!

标签: pythonpandasmulti-index

解决方案


所以我发现我可以根据它们的索引找到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,因为这与一个数据帧完全不同。因此,我能够从它们的索引中找到两个数据帧之间的内部连接。


推荐阅读