我正在尝试创建一个新的数据帧列,它是来自另一个数据帧的部分字符串匹配。我将如何进行以下示例?
df1:
# id
1 666666
2 666667
3 666668
4 666667
df2
# ref
1 ref_666666_blah blah
2 ref_666667_blah blah
3 ref_666668_blah blah
4 ref_666667_blah blah
df3 #what I want
# id match
1 666666 ref_666666_blah blah
2 666667 ref_666667_blah blah
3 666668 ref_666668_blah blah
4 666667 ref_666667_blah blah
我知道这不是代码,但我正在尝试执行以下操作:
df1['match'] = df2['ref'].map(lambda x: x if x.str.contains(df1['match'])
谢谢!
答案 0 :(得分:1)
有很多方法可以实现这一目标。
如果您能够从id
列中提取ref
,就像df2[id] = df2.ref.apply(lambda c: c.split('_')[1])
在此特定示例中一样,您可以继续df1.join(df2, on = 'id')
。
如果您需要调用一些更复杂的匹配功能,您可以执行以下操作:
def getMatch(str_id):
matches = (c for c in df2['ref'] if str_id in c)
try:
return matches.next()
except:
return None
df1['match'] = df1['id'].apply(getMatch)
这将导致许多冗余比较,因此您应该考虑数据中是否存在可以简化匹配的关系。例如,如果每个ref与最多一个id匹配,或者如果你能以某种方式对两个DataFrame进行有意义的排序并以递归方式合并它们。