如何过滤索引和列值的数据框

时间:2019-06-12 11:19:44

标签: python pandas dataframe filter

我有2个这样的数据框:

df1

             sales    day    ...
    index    
    1001     567      321
    1002     600      1530
    1005     789      998
    1008     825      775
    1002     300      1120

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        

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

所以结果应该是:

df2

             sales    day    ...
    index    
    1001     567      321
    1002     600      1530
    1005     789      998
    1008     825      775
    1002     300      1120

我不能按以下方式使用isin函数,因为df2中有行具有相同的索引但行值不同。索引和日期的组合是唯一的。

    df2 = df2[df2.index.isin(df1.index)]

基本上我想在SQL中做的事

    select *
    from   table1 t1,
           table2 t2,
    where  t1.id = t2.id
    and    t1.day = t2.day; 

2 个答案:

答案 0 :(得分:1)

使用MultiIndex参数由DataFrame.set_index创建append,因此可能通过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

替代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

答案 1 :(得分:1)

您可以做的一件事是在两个数据帧上设置一个双索引并使用loc访问:

df1 = df1.reset_index().set_index(['index','day'])
df2 = df2.reset_index().set_index(['index','day'])

print(df2.loc[df1.index])

输出(如果您不希望使用双索引,则可以执行reset_index(level=1)

            sales
index day        
1001  321     567
1002  1530    600
1005  998     789
1008  775     825
1002  1120    300