如何使用正则表达式在熊猫中找到字符串格式的数组?

时间:2019-12-19 08:04:41

标签: python regex pandas dataframe

我有一个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一样,所以它变成了正则表达式,因为所有内容都是字符串格式,但是完全匹配失败。有人可以帮我吗?

2 个答案:

答案 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]