【问题标题】:How to find an array in string format in pandas using regular expression?如何使用正则表达式在熊猫中查找字符串格式的数组?
【发布时间】:2019-12-19 08:04:41
【问题描述】:

我有一个 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,所以它转向正则表达式,因为一切都是字符串格式,但一直失败完全符合。有人可以帮我吗?

【问题讨论】:

  • 预期结果是什么?

标签: python regex pandas dataframe


【解决方案1】:

您可以删除两列中的尾随 [] 并使用带有元组的 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]

【讨论】:

    【解决方案2】:

    如果只有“_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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-28
      • 2018-12-25
      • 2021-03-06
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      相关资源
      最近更新 更多