【问题标题】:compare multiple column value together using pandas使用熊猫比较多列值
【发布时间】:2019-09-17 03:56:21
【问题描述】:

如果我们只检查两列,我知道我可以像 below 那样做。

df['flag'] = df['a_id'].isin(df['b_id'])

其中df 是一个数据框,a_idb_id 是数据框的两列。它将根据匹配返回 TrueFalse 值。但我需要将多个列一起比较。

例如:如果有a_id , a_region, a_ip, b_id, b_region and b_ip 列。我想像下面这样比较,

a_key = df['a_id'] + df['a_region] + df['a_ip']
b_key = df['b_id'] + df['b_region] + df['b_ip']

df['flag'] = a_key.isin(b_key)

不知何故,上面的代码总是返回False 值。输出应该如下所示,

第一行标志将为 True,因为存在匹配项。

a_key 变为 2a10 这与 b_key 的最后一行匹配 (2a10)

【问题讨论】:

  • 您能否添加一个小样本数据框和预期数据框(我们会更好地理解需求)来复制问题,谢谢
  • @anky_91 : 我已经根据你的 cmets 编辑了代码..
  • iirc,应该是a_key.isin(b_key.values)。请尝试一下。

标签: python excel pandas dataframe


【解决方案1】:

您的方向正确,只需使用:

a_key = df['a_id'].astype(str) + df['a_region'] + df['a_ip'].astype(str)
b_key = df['b_id'].astype(str) + df['b_region'] + df['b_ip'].astype(str)

a_key.isin(b_key)

我的结果如下:

0     True
1    False
2    False

【讨论】:

    【解决方案2】:

    您可以使用isinDataFrame 作为值,但要按照docs

    如果 values 是一个 DataFrame,那么索引和列标签都必须 匹配

    所以这应该有效:

    # Removing the prefixes from column names
    df_a = df[['a_id', 'a_region', 'a_ip']].rename(columns=lambda x: x[2:])
    df_b = df[['b_id', 'b_region', 'b_ip']].rename(columns=lambda x: x[2:])
    
    # Find rows where all values are in the other
    matched = df_a.isin(df_b).all(axis=1)
    
    # Get actual rows with boolean indexing
    df_a.loc[matched]
    
    # ... or add boolean flag to dataframe
    df['flag'] = matched
    

    【讨论】:

      【解决方案3】:

      这是使用DataFrame.mergepandas.concat 并测试duplicated 值的一种方法:

      df_merged = df.merge(df,
                           left_on=['a_id', 'a_region', 'a_ip'],
                           right_on=['b_id', 'b_region', 'b_ip'],
                           suffixes=('', '_y'))
      
      df['flag'] = pd.concat([df, df_merged[df.columns]]).duplicated(keep=False)[:len(df)].values
      

      [出]

          a_id a_region    a_ip     b_id b_region   b_ip   flag
      0      2        a      10  3222222    sssss  22222   True
      1  22222    bcccc   10000    43333    ddddd  11111  False
      2  33333    acccc  120000        2        a     10  False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        相关资源
        最近更新 更多