Pandas数据框“ df1”具有带有字符串值的列(“ Receiver”)。
df1
Receiver
44 BANK
106 restaurant
149 Tax office
63 house
55 car insurance
我想遍历该列的每一行,检查它们是否与另一个数据帧(“ df2”)中的值(主要是一词或两词搜索词)匹配,然后在正确的行上返回匹配的列标题。我正在尝试使用以下功能:
df1.Receiver.apply(lambda x:
''.join([i for i in df2.columns
if df2.loc[:,i].str.contains(x).any()])
)
问题: 但是,此仅适用于 df1的“接收器”列中的值,该值由仅一个单词组成(因此,“银行”,“餐厅”和“房屋”在这种情况下有效)。
两个或两个以上单词的值不起作用(在这种情况下为“税收办公室”和“汽车保险”)。
str.contains()是否还应该找到部分匹配项?如何在“接收器”列中具有两个或多个单词的值中找到部分匹配项?
编辑:df2的外观如下,它具有不同的类别作为列标题,然后每个列都将搜索词作为值
df2
Banks Restaurants Car House
0 BANK restaurant car house
1 bank mcdonalds
2 Subway
这是单个问题中的全部问题,可以在右侧看到输出,并且未找到类别“汽车”和“税收办公室”,因为接收者“汽车保险”和“税收办公室” (df1中的接收方列)仅与搜索词“ car”和“ Tax” (df2的“ Car”和“ Tax office”列中的值)部分匹配。
答案 0 :(得分:0)
代替迭代数据框行,可以迭代df2
的列,并将正则表达式与pd.Series.str.contains
一起使用:
df1 = pd.DataFrame({'Receiver': ['BANK', 'restaurant house', 'Tax office', 'mcdonalds car']})
df1['Receiver_new'] = ''
for col in df2:
values = '|'.join(df2[col].dropna())
bool_series = df1['Receiver'].str.contains(values)
df1.loc[bool_series, 'Receiver_new'] += f'{col}|'
print(df1)
# Receiver Receiver_new
# 0 BANK Banks|
# 1 restaurant house Restaurants|House|
# 2 Tax office
# 3 mcdonalds car Restaurants|Car|