我有一个csv文件,其中仅包含一个看起来像这样的列 df1
Col_A
Name
Address
[B00-OUI_001]
Soemthing else
etc.
和另一个类似的东西。
df2
Col_B
[B00-OUI_000_V]
[B00-OUI_002_V]
[B00-OUI_003_V]
[B00-OUI_001_V]
[B00-OUI_005_V]
[B00-OUI_006_V]
[B00-OUI_007_V]
我试图从df1中的df2中找到匹配的条目,就像B00-OUI_001
都在df中,但在df2中它与_V
一样,所以它变成了正则表达式,因为所有内容都是字符串格式,但是完全匹配失败。有人可以帮我吗?
答案 0 :(得分:2)
您可以删除两列中的尾随[]
并使用带有元组的Series.str.startswith
进行过滤:
tups = tuple(df1['Col_A'].str.strip('[]').unique())
df2 = df2[df2['Col_B'].str.strip('[]').str.startswith(tups)]
print (df2)
Col_B
3 [B00OUI_001_V]
另一个想法是,|
为正则表达式OR
连接唯一值并使用Series.str.contains
:
v = '|'.join(df1['Col_A'].str.strip('[]').unique())
df2 = df2[df2['Col_B'].str.strip('[]').str.contains(v)]
print (df2)
Col_B
3 [B00OUI_001_V]
答案 1 :(得分:1)
如果只有“ _V”会破坏精确匹配,为什么不放弃它并创建一个虚拟列索引呢?精确连接总是比任何正则表达式映射都快。
我的意思是
df2["Col_B_edt"]=df2["Col_B"].str.replace("_V]", "]")
df3=pd.merge(df,df2,left_on="Col_A",right_on="Col_B_edt").drop("Col_B_edt", axis=1)
输出:
Col_A Col_B
0 [B00-OUI_001] [B00-OUI_001_V]