【问题标题】:How to use isin while ignoring index如何在忽略索引的情况下使用 isin
【发布时间】:2018-06-01 23:08:50
【问题描述】:

我正在尝试检查行是否存在于另一个数据框中。我没有加入/合并,因为它会创建重复,然后需要过滤掉该重复也可能过滤掉我想要保留的实际重复。

例子:

table1 = pd.DataFrame({'a':[1, 2, 5, 3, 4],
              'b':['a', 'b', 'e', 'c', 'd']})
table2 = pd.DataFrame({'a':[1, 4, 3, 6, 2],
              'b':['a', 'd', 'c', 'f', 'b']})


table1.isin(table2)

       a      b
0   True   True
1  False  False
2  False  False
3  False  False
4  False  False

我希望所有这些都是True,除非在索引 2 处,5 e 行在 table2 中不存在。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC

    table1.stack().isin(table2.stack().values).unstack()
    Out[207]: 
           a      b
    0   True   True
    1   True   True
    2  False  False
    3   True   True
    4   True   True
    

    如果检查行基数

    table1.astype(str).sum(1).isin(table2.astype(str).sum(1))
    

    通过使用merge

    table1.merge(table2.assign(vec=True),how='left').fillna(False)
    Out[232]: 
       a  b    vec
    0  1  a   True
    1  2  b   True
    2  5  e  False
    3  3  c   True
    4  4  d   True
    

    【讨论】:

    • @MattW。 yw :-) 快乐编码
    • 对不起,但似乎 OP 需要您评论的解决方案,不推荐真正容易的方法,因为很容易误报。之间需要分隔符。
    • @jezrael 我在最后屏蔽了一个解决方案 :-)
    • 是的,我要说的是,不幸的是通常非常糟糕的解决方案。
    • 我试着解释一下为什么如果有多个列然后 sum 返回每行一个字符串和 i
    【解决方案2】:

    如果需要分别比较每个值,将table2转换为1d数组:

    a = table1.isin(table2.values.ravel())
    print (a)
           a      b
    0   True   True
    1   True   True
    2  False  False
    3   True   True
    4   True   True
    

    如果需要单独比较每一行:

    a = (table1.apply(tuple, 1).isin(table2.apply(tuple, 1)))
    

    或者:

    a = (table1.astype(str).apply('###'.join, 1).isin(table2.astype(str).apply('###'.join, 1).))
    
    
    print (a)
    0     True
    1     True
    2    False
    3     True
    4     True
    dtype: bool
    

    为了更好地解释输入数据已更改:

    table1 = pd.DataFrame({'a':[1, 2, 5, 3, 4],
                  'b':['d', 'b', 'e', 'c', 'd']})
    table2 = pd.DataFrame({'a':[1, 4, 3, 6, 2],
                  'b':['a', 'd', 'c', 'f', 'b']})
    
    print (table1)
       a  b
    0  1  d -> changed to d
    1  2  b
    2  5  e
    3  3  c
    4  4  d
    
    print (table2)
       a  b
    0  1  a
    1  4  d
    2  3  c
    3  6  f
    4  2  b
    

    a = table1.isin(table2.values.ravel())
    print (a)
           a      b
    0   True   True  d exist in table2, so True
    1   True   True
    2  False  False
    3   True   True
    4   True   True
    
    a = (table1.apply(tuple, 1).isin(table2.apply(tuple, 1)))
    print (a)
    0    False -> comparing 1-a with 1-b return False
    1     True
    2    False
    3     True
    4     True
    dtype: bool
    

    【讨论】:

    • 我收到一个错误:Can only compare identically-labeled DataFrame objects。如果您将另一行添加到 table2 中不存在的 table1 中,则一切都会崩溃,因为应该是我正在使用的更具代表性的数据集。我将编辑起始数据集
    • @MattW。 - 所以需要分别比较每个值?不是每一行?检查编辑的答案。
    • 比较整行。所以最终一旦得到真假表,我会添加.all(axis=1)
    • 那么需要按元组比较或加入每一行。我尝试解释更改的输入数据的差异。
    • 元组版本似乎不适用于我的数据集。它返回一个完整的布尔表而不是一个向量
    猜你喜欢
    • 2013-04-05
    • 2019-04-26
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2012-06-23
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多