Python 查询多索引数据框以区分中的条目和非中的条目

Python 查询多索引数据框以区分中的条目和非中的条目,python,pandas,dataframe,indexing,multi-index,Python,Pandas,Dataframe,Indexing,Multi Index,我有一个如下所示的数据帧: FirstDF= C A B 'a' 'blue' 43 'green' 59 'b' 'red 56 'c' 'green' 80 'orange' 72 insDF = FirstDF.loc[zip(SecondDF['A'],SecondDF['B'])] outsDF = FirstDF.loc[~zip(SecondDF['A'],SecondDF['B'])] 其中A和B被

我有一个如下所示的数据帧:

FirstDF=
              C
A    B      
'a' 'blue'   43
    'green'  59
'b' 'red     56
'c' 'green'  80
    'orange' 72
insDF = FirstDF.loc[zip(SecondDF['A'],SecondDF['B'])]
outsDF = FirstDF.loc[~zip(SecondDF['A'],SecondDF['B'])]
其中A和B被设置为索引。我还有一个数据框,看起来像:

SecondDF=

    A     B
0  'a'  'green'
1  'b'  'red'
2  'c'  'green'
有没有一种方法可以直接用最后一个查询FirstDF,并获得如下输出

C
59
56
80
我还需要获得SecondDF中没有的值:

C
43
72
我是通过迭代FirstDF的索引来实现的,如下所示,但我希望使用pandas逻辑而不是for循环

ins=[]
outs=[]
for i in FirstDF.index:
    if i in zip(SecondDF['A'],SecondDF['B']):
        ins.append(i)
    else:
        outs.append(i)

insDF = FirstDF.loc[ins]
outsDF = FirstDF.loc[outs]
但是,这种方法会导致与大数据集的结果不一致,因为在我的例子中,outsDF数据帧比原始数据帧FirstDF有更多的条目

我也试过这样的方法:

FirstDF=
              C
A    B      
'a' 'blue'   43
    'green'  59
'b' 'red     56
'c' 'green'  80
    'orange' 72
insDF = FirstDF.loc[zip(SecondDF['A'],SecondDF['B'])]
outsDF = FirstDF.loc[~zip(SecondDF['A'],SecondDF['B'])]
但这会引起一个错误。
有什么想法吗?

您可以将df2中的A列和B列设置为索引,然后合并:

df2.set_index(['A', 'B'], inplace=True)
pd.merge(df1,df2,left_index=True, right_index=True)
输出:


您只需在下面使用Pandas
merge

>>> pd.merge(df1, df2, on=['A', 'B'])['C']
0    59
1    56
2    80
Name: C, dtype: int64

>>> df = df1.merge(df2, left_index=True, right_on=['A','B'])['C'].to_frame()
>>> df
    C
0  59
1  56
2  80

>>> pd.merge(df1, df2, on=['A', 'B'])
   A      B   C
0  a  green  59
1  b    red  56
2  c  green  80

我还需要得到不在df2中的值,知道吗?试试这个,
df1[~df1.isin(df2.all(axis=1)]
我还需要得到不在df2中的值,知道吗?@AndrésMarulanda,你的值在df1中,但不在df2中?