我想搜索文本内容的一部分是否出现在另一个数据框中
我有两个数据框。
data_drop
Palabra Uri Texto
a aa 'abc abc bda abc abc bda'
b bb 'abc abc bdx abc abc bda'
c bb 'abc abc bdy abc abc bda'
df_keyword_drop
title head text
x xx 'bdx abc'
y yy 'bdy abc'
z zz 'zzz zzz zzz'
输出为
结果
title name text
a aa 'bdx abc'
b bb 'bdy abc'
更新:列数据和df_keyword的名称
我运行此代码
mask = df_keyword_drop.apply(lambda s: any(part in data_drop.loc[s.name, "Texto"] for part in s.text.split()),axis=1)
new = data_drop[mask].assign(text=df_keyword_drop.loc[mask, "text"])
但是我有这个错误:
--> 352 raise KeyError(key)
353 return super().get_loc(key, method=method, tolerance=tolerance)
354
KeyError: 279
您可以尝试以下方法:
mask = df2.apply(lambda s: any(part in df1.loc[s.name, "text"] for part in s.text.split()),
axis=1)
new = df1[mask].assign(text=df2.loc[mask, "text"])
对于掩码生成,我们获取df2
的行,并检查字符串的any部分是否与相应行的文本字段匹配。然后,将遮罩应用于df1
。由于所需的text
列应来自df2
,因此我们从df2
中assign该列并获得所需的新数据帧。
编辑以上解决方案假定数据帧的长度相等。如果其中之一较短,则
cropped = df2.iloc[:len(df1.index), :]
mask = cropped.apply(lambda s: any(part in df1.loc[s.name, "text"]
for part in s.text.split()),
axis=1)
new = df1[mask].assign(text=cropped.loc[mask, "text"])
输出的索引可能不是RangeIndex
,即根据匹配情况,它可能会混合为[2,4,5,..]。要将其重置为[0,1,2 ...],请使用reset_index
:
new = new.reset_index(drop=True)