Python Pandas-如果dfb中的值与particualr行的dfa中的值匹配,则返回True

Python Pandas-如果dfb中的值与particualr行的dfa中的值匹配,则返回True,python,pandas,Python,Pandas,我有一个要求,我必须在两个数据帧的两列之间进行精确匹配 df[res_name] = df[plain_col] == df[b_col] 现在,我想给它添加一个包含逻辑 例如,如果 在df[plain_col]中找到df[b_col]值,然后返回True,否则返回False 用法 df[b_col]的值为1A,df[Plain_col]的值为1A12。然后输出将为真 我相信您需要使用zip和中的来理解列表,以便按行处理: df = pd.DataFrame({'plain_col':['1A

我有一个要求,我必须在两个数据帧的两列之间进行精确匹配

df[res_name] = df[plain_col] == df[b_col]
现在,我想给它添加一个包含逻辑

例如,如果

在df[plain_col]中找到df[b_col]值,然后返回True,否则返回False

用法


df[b_col]的值为1A,df[Plain_col]的值为1A12。然后输出将为真

我相信您需要使用
zip
中的
来理解列表,以便按行处理:

df = pd.DataFrame({'plain_col':['1A12','1C12','1B12'],
                   'b_col':['1A','1B','1C']})

df['res_name'] = [b in a for a, b in zip(df['plain_col'], df['b_col'])]
print (df)
  plain_col b_col  res_name
0      1A12    1A      True
1      1C12    1B     False
2      1B12    1C     False
性能

df = pd.DataFrame({'plain_col':['1A12','1C12','1B12'],
                   'b_col':['1A','1B','1C']})

#3k rows
df = pd.concat([df] * 1000, ignore_index=True)

In [15]: %timeit df['res_name'] = [b in a for a, b in zip(df['plain_col'], df['b_col'])]
605 µs ± 30 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [16]: %timeit df['res_name'] = df.apply(lambda row:row.b_col in row.plain_col, axis=1)
75.2 ms ± 320 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
编辑:

错误
浮点类型的参数不可迭代
显然意味着缺少值,可能的解决方案是:

df = pd.DataFrame({'plain_col':['1A12','1C12',np.nan],
                   'b_col':['1A','1B','1C']})


def func(a, b):
    if (a != a) or (b != b):
        return False
    return b in a

df['res_name'] = list(map(func, df['plain_col'], df['b_col']))
print (df)
  plain_col b_col  res_name
0      1A12    1A      True
1      1C12    1B     False
2       NaN    1C     False
另一个更普遍的解决方案:

df = pd.DataFrame({'plain_col':['1A12',6.7,np.nan],
                   'b_col':['1A','1B','1C']})


def func(a, b):
    try:
        return b in a
    except Exception:
        return False

df['res_name'] = list(map(func, df['plain_col'], df['b_col']))
print (df)
  plain_col b_col  res_name
0      1A12    1A      True
1       6.7    1B     False
2       NaN    1C     False

我相信您需要使用
zip
中的
来理解列表,以便按行处理:

df = pd.DataFrame({'plain_col':['1A12','1C12','1B12'],
                   'b_col':['1A','1B','1C']})

df['res_name'] = [b in a for a, b in zip(df['plain_col'], df['b_col'])]
print (df)
  plain_col b_col  res_name
0      1A12    1A      True
1      1C12    1B     False
2      1B12    1C     False
性能

df = pd.DataFrame({'plain_col':['1A12','1C12','1B12'],
                   'b_col':['1A','1B','1C']})

#3k rows
df = pd.concat([df] * 1000, ignore_index=True)

In [15]: %timeit df['res_name'] = [b in a for a, b in zip(df['plain_col'], df['b_col'])]
605 µs ± 30 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [16]: %timeit df['res_name'] = df.apply(lambda row:row.b_col in row.plain_col, axis=1)
75.2 ms ± 320 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
编辑:

错误
浮点类型的参数不可迭代
显然意味着缺少值,可能的解决方案是:

df = pd.DataFrame({'plain_col':['1A12','1C12',np.nan],
                   'b_col':['1A','1B','1C']})


def func(a, b):
    if (a != a) or (b != b):
        return False
    return b in a

df['res_name'] = list(map(func, df['plain_col'], df['b_col']))
print (df)
  plain_col b_col  res_name
0      1A12    1A      True
1      1C12    1B     False
2       NaN    1C     False
另一个更普遍的解决方案:

df = pd.DataFrame({'plain_col':['1A12',6.7,np.nan],
                   'b_col':['1A','1B','1C']})


def func(a, b):
    try:
        return b in a
    except Exception:
        return False

df['res_name'] = list(map(func, df['plain_col'], df['b_col']))
print (df)
  plain_col b_col  res_name
0      1A12    1A      True
1       6.7    1B     False
2       NaN    1C     False
那怎么办

df['res_name'] = df.apply(lambda row:row.b_col in row.plain_col, axis=1)
那怎么办

df['res_name'] = df.apply(lambda row:row.b_col in row.plain_col, axis=1)

不,我希望在相应的行上这样做。例如,对于所有示例,它将返回false。1A在普通列索引0中找不到,1B在普通列索引1中找不到,1C在普通列索引2中找不到。@Sid29-更改解决方案。它说,float类型的参数是不可迭代的。@Sid29因此需要更改
def func(a,b):if(a!=a)或(b!=b):返回False将a中的b返回到
def func(a,b):if(a!=a)或(b!=b):return True return b in a
现在就知道了。谢谢,我希望在相应的行上这样做。例如,对于您的所有示例,它都会返回false。1A在普通列索引0中找不到,1B在普通列索引1中找不到,1C在普通列索引2中找不到。@Sid29-更改解决方案。它说,float类型的参数不可迭代。@Sid29因此需要更改
def func(a,b):如果(a!=a)或(b!=b):返回False在a
中返回b到
def func(a,b):如果(a!=a)或(b!=b):return True a中的return b
现在得到了。感谢可能的解决方案,但在大数据帧中速度较慢。可能的解决方案,但在大数据帧中速度较慢。