使用熊猫一起比较多个列值

时间:2019-04-28 07:06:41

标签: python excel pandas dataframe

如果我们只一起检查两列,我知道我会喜欢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列。我想像下面这样比较,

enter image description here

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值。输出应如下所示,

enter image description here

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

a_key变为2a10,这与b_key (2a10)

的最后一行匹配

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

您可以将static int BITS_IN_INTEGER = 4; static int INTEGER_MASK = (1 << BITS_IN_INTEGER) - 1; static int leftRotate(int x, int n) { return INTEGER_MASK & ((x << n) | (x >>> (BITS_IN_INTEGER - n))); } isin用作值,但要遵守docs的要求:

  

如果值是DataFrame,则索引标签和列标签都必须   匹配

所以这应该起作用:

DataFrame

答案 2 :(得分:2)

这是使用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