Python 如何对多个列使用isin

Python 如何对多个列使用isin,python,pandas,Python,Pandas,我想找到col1和col2的值,其中第一个数据帧的col1和col2都在第二个数据帧中 这些行应位于结果数据框中: 比萨饼,小子 披萨,女孩 冰淇淋,孩子 因为所有三行都在第一个和第二个数据帧中 我怎么可能做到这一点?我在考虑使用 ISIN ,但是当我必须考虑一个以上的列时,我不知道如何使用它。 < P>执行一个ON代码> COL1和 COL2< /代码>: import pandas as pd df1 = pd.DataFrame({'col1': ['pizza', 'hamburger'

我想找到
col1
col2
的值,其中第一个数据帧的
col1
col2
都在第二个数据帧中

这些行应位于结果数据框中:

  • 比萨饼,小子

  • 披萨,女孩

  • 冰淇淋,孩子

  • 因为所有三行都在第一个和第二个数据帧中

    我怎么可能做到这一点?我在考虑使用<代码> ISIN <代码>,但是当我必须考虑一个以上的列时,我不知道如何使用它。

    < P>执行一个ON代码> COL1和<代码> COL2< /代码>:

    import pandas as pd
    df1 = pd.DataFrame({'col1': ['pizza', 'hamburger', 'hamburger', 'pizza', 'ice cream'], 'col2': ['boy', 'boy', 'girl', 'girl', 'boy']}, index=range(1,6))
    df2 = pd.DataFrame({'col1': ['pizza', 'pizza', 'chicken', 'cake', 'cake', 'chicken', 'ice cream'], 'col2': ['boy', 'girl', 'girl', 'boy', 'girl', 'boy', 'boy']}, index=range(10,17))
    
    print(pd.merge(df2.reset_index(), df1, how='inner').set_index('index'))
    
    屈服

                col1  col2
    index                 
    10         pizza   boy
    11         pizza  girl
    16     ice cream   boy
    
             col1  col2
    10      pizza   boy
    11      pizza  girl
    16  ice cream   boy
    
    reset\u index
    set\u index
    调用的目的是将
    df2
    的索引保留为您发布的所需结果。如果索引不重要,则

    pd.merge(df2, df1, how='inner')
    #         col1  col2
    # 0      pizza   boy
    # 1      pizza  girl
    # 2  ice cream   boy
    
    就够了


    或者,您可以从
    col1
    col2
    列中构造,然后调用:

    屈服

                col1  col2
    index                 
    10         pizza   boy
    11         pizza  girl
    16     ice cream   boy
    
             col1  col2
    10      pizza   boy
    11      pizza  girl
    16  ice cream   boy
    
    谢谢你! 这里有一点更新

    import pandas as pd
    df1 = pd.DataFrame({'col1': ['pizza', 'hamburger', 'hamburger', 'pizza', 'ice cream'], 'col2': ['boy', 'boy', 'girl', 'girl', 'boy']}, index=range(1,6))
    df2 = pd.DataFrame({'col1': ['pizza', 'pizza', 'chicken', 'cake', 'cake', 'chicken', 'ice cream'], 'col2': ['boy', 'girl', 'girl', 'boy', 'girl', 'boy', 'boy']}, index=range(10,17))
    df1[df1.set_index(['col1','col2']).index.isin(df2.set_index(['col1','col2']).index)]
    
    返回:

        col1    col2
    1   pizza   boy
    4   pizza   girl
    5   ice cream   boy
    

    如果您必须坚持使用
    isin
    或否定版本
    ~isin
    。 您可以首先创建一个新列,将
    col1
    col2
    串联在一起。然后使用
    isin
    过滤数据。代码如下:

    import pandas as pd
    df1 = pd.DataFrame({'col1': ['pizza', 'hamburger', 'hamburger', 'pizza', 'ice cream'], 'col2': ['boy', 'boy', 'girl', 'girl', 'boy']}, index=range(1,6))
    df2 = pd.DataFrame({'col1': ['pizza', 'pizza', 'chicken', 'cake', 'cake', 'chicken', 'ice cream'], 'col2': ['boy', 'girl', 'girl', 'boy', 'girl', 'boy', 'boy']}, index=range(10,17))
    
    df1['indicator'] = df1['col1'].str.cat(df1['col2'])
    df2['indicator'] = df2['col1'].str.cat(df2['col2'])
    
    df2.loc[df2['indicator'].isin(df1['indicator'])].drop(columns=['indicator'])
    

    
        col1    col2
    10  pizza   boy
    11  pizza   girl
    16  ice cream   boy
    
    如果这样做,请记住确保连接两列不会产生误报,例如
    df1
    中的
    123
    456
    的连接以及
    df2
    中的
    12
    3456
    的连接将匹配,即使它们各自的列不匹配。您可以通过附加
    sep
    参数来解决此问题

    df1['indicator'] = df1['col1'].str.cat(df1['col2'], sep='$$$')
    df2['indicator'] = df2['col1'].str.cat(df2['col2'], sep='$$$')
    

    最好的方法是将dict传递给isin()

    正如建议的那样

    文档还显示了如何传递字典的另一个示例