如何根据索引和列值过滤数据帧

dar*_*agh 5 python filter dataframe pandas

我有两个这样的数据框:

df1

             sales    day    ...
    index    
    1001     567      321
    1002     600      1530
    1005     789      998
    1008     825      775
    1002     300      1120
Run Code Online (Sandbox Code Playgroud)

df2

             sales    day    ...
    index    
    1001     567      321
    1002     600      1530
    1005     789      998
    1014     620      1000
    1008     825      775
    1009     589      1100
    1002     300      1120
    1005     770      400
    1008     820      1600        
Run Code Online (Sandbox Code Playgroud)

我只想保留 df2 中索引和日期值与 df1 完全相同的行

所以结果应该是:

df2

             sales    day    ...
    index    
    1001     567      321
    1002     600      1530
    1005     789      998
    1008     825      775
    1002     300      1120
Run Code Online (Sandbox Code Playgroud)

我无法使用 isin 函数,如下所示,因为 df2 中的某些行具有相同的索引但日期值不同。索引和日期的组合是唯一的。

    df2 = df2[df2.index.isin(df1.index)]
Run Code Online (Sandbox Code Playgroud)

本质上我想在 SQL 中做的是

    select *
    from   table1 t1,
           table2 t2,
    where  t1.id = t2.id
    and    t1.day = t2.day; 
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 2

想法是MultiIndex通过参数创建DataFrame.set_indexappend,因此可以通过以下方式过滤Index.isin

df = df2[df2.set_index('day', append=True).index.isin(df1.set_index('day', append=True).index)]
print (df)
       sales   day
index             
1001     567   321
1002     600  1530
1005     789   998
1008     825   775
1002     300  1120
Run Code Online (Sandbox Code Playgroud)

替代方案merge

df = (df1.reset_index()
         .merge(df2.reset_index(), on=['day','index'], suffixes=('_',''))
         .set_index('index')[df2.columns])
print (df)
       sales   day
index             
1001     567   321
1002     600  1530
1005     789   998
1008     825   775
1002     300  1120
Run Code Online (Sandbox Code Playgroud)