Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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_Dataframe_Filter_Countif - Fatal编程技术网

Python 如何基于另一个数据帧过滤多索引数据帧

Python 如何基于另一个数据帧过滤多索引数据帧,python,pandas,dataframe,filter,countif,Python,Pandas,Dataframe,Filter,Countif,我有两个数据框,一个更大,带有名称和族名称,定义为多索引(族和名称)数据框: Age Weight Family Name Marge SIMPSON Bart Lisa Homer Harry POTTER Lilian Lisa James 另一个df较小,仅包含第一个df的一些名称: Family Name SIMPSO

我有两个数据框,一个更大,带有名称和族名称,定义为多索引(族和名称)数据框:

                Age   Weight 
Family   Name
         Marge
SIMPSON  Bart
         Lisa    
         Homer

         Harry
POTTER   Lilian
         Lisa
         James
另一个df较小,仅包含第一个df的一些名称:

Family   Name
SIMPSON  Lisa
SIMPSON  Bart
POTTER   Lisa
我想过滤第一个df,只显示第二个df中存在的名称。
为了更好地解释,作为参考,我将在Excel中创建一个额外的列和类型(假设第二个df位于Sheet2中)
=COUNTIFS(Sheet2!A:Sheet2!A,A1,Sheet2!B:Sheet2!B,B1)

然后在创建的列中筛选等于1的行。

Ps:我不是在问如何复制excel代码,因为我知道在python中可能有一种简单的方法。

您的
df1
有多个索引,所以普通的过滤器无法工作,我们可以尝试
reindex

df1 = df1.reindex(pd.MultiIndex.from_frame(df2))

df1
成为带有
multiindex
的较大数据帧和带有名称的
df2
较小数据帧

然后你可以这样做:

names = set(df2.Name.astype(str).values)
df1 = df1.loc[df1.index.get_level_values('Name').isin(names)]
加入

合并

在我向下滚动之前,这就是我的想法,我知道如果您提供了答案,我会找到这个答案(-:
df2.join(df1, on=df1.index.names).set_index(df1.index.names)

              Age Weight
Family  Name            
SIMPSON Lisa  NaN    NaN
        Bart  NaN    NaN
POTTER  Lisa  NaN    NaN
 df1.merge(df2, on=df1.index.names).set_index(df1.index.names)

              Age Weight
Family  Name            
SIMPSON Lisa  NaN    NaN
        Bart  NaN    NaN
POTTER  Lisa  NaN    NaN