Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用一个数据帧的内容索引另一个多级索引数据帧?_Python_Pandas_Multi Index - Fatal编程技术网

Python 如何使用一个数据帧的内容索引另一个多级索引数据帧?

Python 如何使用一个数据帧的内容索引另一个多级索引数据帧?,python,pandas,multi-index,Python,Pandas,Multi Index,我有以下数据帧site_1_df和'site_2_df(两者类似): 站点1\u 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",

我有以下数据帧
site_1_df
和'site_2_df(两者类似):

站点1\u 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"]]
索引交叉口

因此,
site_1_df
site_2_df
显然是多级索引数据帧。因此,我想使用
索引\u交叉点
对上述数据帧进行索引。或者,如果我从site_1_df建立索引,那么我需要来自同一数据帧的行的子集。从技术上讲,我应该得到一个数据帧,它有(8556行x 6列),也就是说,索引交叉的行数相同。我怎样才能在熊猫身上有效地做到这一点

我试过:

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

非常感谢您的帮助

所以我发现我可以根据两个数据帧的索引通过以下方式找到它们的交集:

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\u索引([0])
用于忽略站点号,因为不同数据帧之间的站点号完全不同。因此,我能够从两个数据帧的索引中找到它们之间的内部联接。

请提供所需的输出。如果我从
站点\u 1\u df
索引,那么我需要行的子集。从技术上讲,我应该返回一个具有(8556行x 6列)的数据帧,即,
索引交叉点的行数相同。我希望这能让事情变得更清楚。在你的问题中写出你想要的东西。你会得到更好的答案。显然,截断行的#,但包括所有列、标记和至少3或4行数据。