【问题标题】:Find the string matching between two data frames查找两个数据帧之间的字符串匹配
【发布时间】:2019-03-16 11:41:21
【问题描述】:

我有一个如下的 DataFrame。

DF1:

   A
Any Match
Credit
I need a debit card.
Logging
Awesome

我有另一个 DataFrame 如下:

DF2:

          B
I did not find any match.
I want a credit card.
I need a debit card.
I do not know.
I am logging into credit portal.

我需要我的输出:

              B                           A
     I did not find any match.        Any Match
     I want a credit card.            Credit
     I need a debit card.             I need a debit card.
     I am logging into credit portal. logging,credit

如果 DF1 中出现的短语在 DF2 中出现的任何文本中,则在此处。 将 o/p 打印为文本和重要短语。

【问题讨论】:

  • 为什么它只返回DebitI need a debit card 同时出现在DF1 和DF2 中?
  • 请解释您的尝试,并提供一个我们可以从哪里开始的最小示例。此外,如果 B 中的一个短语包含多个 A 中的短语,或者一个都不包含,以及如果 B 中的两个短语包含 A 中的相同短语怎么办。请详细说明您对您的具体要求输出。
  • @AkshayNevrekar..非常抱歉这是我的错误。我已经编辑了那个。
  • @jdehesa..如果它包含多个短语,它应该返回两个。如果 B 中的两个短语包含 A 中的相同短语,则两者都应返回相同的短语。

标签: python string pandas dataframe


【解决方案1】:

试试这个

df1['B'] = float('nan')

pos = 0
for i in range(len(df1)):
    for j in range(len(df2)):
        if df1['A'][i].lower() in df2['B'][j].lower():
            df1['B'].iloc[pos] = df2['B'][j]
            pos+=1
            break

df1.dropna(axis=0)

输出

                     A                          B
0            Any Match  I did not find any match.
1               Credit      I want a credit card.
2  I need a debit card       I need a debit card.

【讨论】:

    【解决方案2】:

    你可以做这样的事情。首先,定义一个匹配“规范化”文本的查找函数,例如小写:

    def lookup(x, values):
        for value in values:
            if value.lower() in x.lower():
                return value
    

    然后将此函数应用于您的 DF2:

    dfB['A'] = dfB['B'].apply(lambda x: lookup(x, dfA['A']))
    

    应该给你的:

        B                           A
    0   I did not find any match.   Any Match
    1   I want a credit card.       Credit
    2   I need a debit card.        Debit
    3   I do not know.              None
    

    【讨论】:

      【解决方案3】:

      试试Fuzzywuzzy:

      import pandas as pd
      from fuzzywuzzy import fuzz
      
      matched_entities = []
      
      for row in df1.index:
          name1 = vendor_df.get_value(row,"A")
          for columns in df2.index:
              name2=df2.get_value(columns,"B")
              matched_token=fuzz.partial_ratio(name1,name2)
              if matched_token> 80:
                  matched_vendors.append([A,B])
      
      df_partial_ratio = pd.DataFrame(columns=['A', 'B'], data=matched_entities)
      

      如果fuzz.partial_ratio 不起作用,请在您的数据库中尝试fuzz.ratiofuzz.token_sort_ratio。这两个可以通过将上面的一行代码更改为以下代码来实现:

      matched_token=fuzz.ratio(name1,name2)
      

      matched_token=fuzz.token_sort_ratio(name1,name2)
      

      【讨论】:

        猜你喜欢
        • 2020-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        相关资源
        最近更新 更多