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
现在得到了。感谢可能的解决方案,但在大数据帧中速度较慢。可能的解决方案,但在大数据帧中速度较慢。