【问题标题】:Why does .str.contains() not find partial matches here? (Pandas dataframe)为什么 .str.contains() 在这里找不到部分匹配项? (熊猫数据框)
【发布时间】:2019-06-05 16:50:08
【问题描述】:

Pandas 数据框“df1”有一个包含字符串值的列(“Receiver”)。

df1
    Receiver
44  BANK
106 restaurant
149 Tax office
63  house
55  car insurance

我想遍历该列的每一行,检查它们是否与另一个数据帧(“df2”)中的值(主要是一个或两个词的搜索词)匹配,并在正确的行上返回匹配列的标题。我正在尝试使用以下功能:

df1.Receiver.apply(lambda x:
                               ''.join([i for i in df2.columns 
                               if df2.loc[:,i].str.contains(x).any()]) 
                               )

问题: 但是,这仅适用于 df1 的“接收者”列中包含一个单词的值(因此“BANK”、“restaurant”和“house”在这种情况下有效)。

包含两个或多个单词的值无效(本例中为“税务局”和“汽车保险”)。

str.contains() 不应该也找到部分匹配项吗?我如何才能找到“接收者”列中包含两个或多个单词的值的部分匹配项?

编辑:这是 df2 的样子,它有不同的类别作为列标题,然后每一列都有搜索词作为值

df2
    Banks    Restaurants   Car           House
0   BANK     restaurant    car           house
1   bank     mcdonalds     
2            Subway                 

这是单个图像中的整个问题,可以在右侧看到输出,并且找不到类别“汽车”和“税务局”,因为接收者“汽车保险”和“税务局” (df1 中的接收者列)仅与搜索词“car”和“Tax”(df2 的“Car”和“Tax office”列中的值。

【问题讨论】:

  • df2 是什么?没有它,这段代码就无法运行
  • 我在问题中添加了一个df2的例子
  • 请发布所需的输出。
  • 我发布了一张显示问题的图片。所需的输出(右下角)将包括第 2 行中的“Tax office”和第 4 行中的“Car”。
  • 如果您向df2 添加另一行,其中包含缺少的项目,我认为它会起作用。请注意"Tax office" 不包含在"Tax" 中。

标签: python string pandas string-matching partial-matches


【解决方案1】:

您可以迭代df2 的列并将正则表达式与pd.Series.str.contains 一起使用,而不是迭代您的数据框行:

df1 = pd.DataFrame({'Receiver': ['BANK', 'restaurant house', 'Tax office', 'mcdonalds car']})

df1['Receiver_new'] = ''
for col in df2:
    values = '|'.join(df2[col].dropna())
    bool_series = df1['Receiver'].str.contains(values)
    df1.loc[bool_series, 'Receiver_new'] += f'{col}|'

print(df1)

#            Receiver        Receiver_new
# 0              BANK              Banks|
# 1  restaurant house  Restaurants|House|
# 2        Tax office                    
# 3     mcdonalds car    Restaurants|Car|

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 2016-08-28
    • 2019-08-20
    • 2015-10-23
    • 2016-08-07
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多