如果我们只一起检查两列,我知道我会喜欢below。
df['flag'] = df['a_id'].isin(df['b_id'])
其中df
是数据帧,而a_id
和b_id
是数据帧的两列。它将根据匹配结果返回True
或False
值。但是我需要一起比较多个列。
例如:如果有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)
答案 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.merge
,pandas.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