在 Pandas 中,如何使用多索引过滤其他数据帧



我有两个数据帧。第一个 (df1) 有一个多索引 A,B。第二个 (df2) 将这些字段 A 和 B 作为列。

如何为大型数据集(每个数据集 200 万行)过滤 df2 以仅获取 df2 中 A 和 B 不在 df1 的多索引中的行

import pandas as pd
df1 = pd.DataFrame([(1,2,3),(1,2,4),(1,2,4),(2,3,4),(2,3,1)], 
                    columns=('A','B','C')).set_index(['A','B'])
df2 = pd.DataFrame([(7,7,1,2,3),(7,7,1,2,4),(6,6,1,2,4),
                    (5,5,6,3,4),(2,7,2,2,1)], 
                     columns=('X','Y','A','B','C'))

DF1:

     C
A B   
1 2  3
  2  4
  2  4
2 3  4
  3  1

过滤前的 DF2:

   X  Y  A  B  C
0  7  7  1  2  3
1  7  7  1  2  4   
2  6  6  1  2  4
3  5  5  6  3  4
4  2  7  2  2  1

DF2 想要的结果:

   X  Y  A  B  C
3  5  5  6  3  4
4  2  7  2  2  1

通过A,B列在df2中创建MultiIndex,并使用~Index.isin过滤带有boolean indexing的反转布尔掩码:

df = df2[~df2.set_index(['A','B']).index.isin(df1.index)]
print (df)
   X  Y  A  B  C
3  5  5  6  3  4
4  2  7  2  2  1

另一个类似的解决方案与MultiIndex.from_arrays

df = df2[~pd.MultiIndex.from_arrays([df2['A'],df2['B']]).isin(df1.index)]

@Sandeep卡达帕的另一个解决方案:

df = df2[df2[['A','B']].ne(df1.reset_index()[['A','B']]).any(axis=1)]

最新更新