Python-在字符串列表中搜索子字符串列表,从另一列返回最大值

Python-在字符串列表中搜索子字符串列表,从另一列返回最大值,python,pandas,Python,Pandas,df1包含我要搜索的较大的主字符串。df2包含一个子字符串列表,与每个子字符串关联的是一个值 import pandas as pd df1 = pd.DataFrame(columns = ['MainString']) df1 = df1.append({'MainString':'abcdef'}, ignore_index=True) df1 = df1.append({'MainString':'ghijkl'}, ignore_index=True) df1 = df1.appen

df1包含我要搜索的较大的主字符串。df2包含一个子字符串列表,与每个子字符串关联的是一个值

import pandas as pd

df1 = pd.DataFrame(columns = ['MainString'])
df1 = df1.append({'MainString':'abcdef'}, ignore_index=True)
df1 = df1.append({'MainString':'ghijkl'}, ignore_index=True)
df1 = df1.append({'MainString':'mnopqr'}, ignore_index=True)
df1 = df1.append({'MainString':'stuvwx'}, ignore_index=True)

df2 = pd.DataFrame(columns = ['Substring','Value'])
df2 = df2.append({'Substring':'bcde','Value':0.5}, ignore_index=True)
df2 = df2.append({'Substring':'bcd','Value':0.6}, ignore_index=True)
df2 = df2.append({'Substring':'mno','Value':0.4}, ignore_index=True)
df2 = df2.append({'Substring':'stuv','Value':0.7}, ignore_index=True)
df2 = df2.append({'Substring':'uvwx','Value':0.7}, ignore_index=True)
df2 = df2.append({'Substring':'stu','Value':0.4}, ignore_index=True)

print(df1)
  MainString
0     abcdef
1     ghijkl
2     mnopqr
3     stuvwx

print(df2)
  Substring  Value
0      bcde    0.5
1       bcd    0.6
2       mno    0.4
3      stuv    0.7
4      uvwx    0.7
5       stu    0.4
我想在
df1['MainString']
中搜索
df2['Substring']
中的值,但随后只返回最大值。如果出现平局(如stuv和uvwx),请返回第一个。因此,期末考试将类似于:

  MainString Substring Value
0     abcdef       bcd   0.6
1     ghijkl       NaN   NaN
2     mnopqr       mno   0.4
3     stuvwx      stuv   0.7
我不确定是否需要循环并用每个子字符串计算每个主字符串。我尝试过调整,但它只返回第一个匹配的字符串,而不是具有最高值的子字符串:

s_list = list(df2['Substring'])
s_list = '(' + '|'.join(s_list) + ')'
df1['test'] = df1['MainString'].str.extract(s_list, expand=False)

print(df1)
  MainString  test
0     abcdef  bcde
1     ghijkl   NaN
2     mnopqr   mno
3     stuvwx  stuv
来自的代码允许您在子字符串匹配上连接两个数据帧。它贪婪地选择第一个匹配项,因此您必须按相关值对包含子字符串的数据帧进行排序,以便匹配最高值

以下代码为您的示例实现了这一点:

pattern = "|".join(df2.sort_values("Value", ascending=False).Substring)
result = df1.copy()
result.insert(
    0, "Substring", df1["MainString"].str.extract("(" + pattern + ")", expand=False)
)

result = result.join(df2.set_index("Substring"), on="Substring")
来自的代码允许您在子字符串匹配上连接两个数据帧。它贪婪地选择第一个匹配项,因此您必须按相关值对包含子字符串的数据帧进行排序,以便匹配最高值

以下代码为您的示例实现了这一点:

pattern = "|".join(df2.sort_values("Value", ascending=False).Substring)
result = df1.copy()
result.insert(
    0, "Substring", df1["MainString"].str.extract("(" + pattern + ")", expand=False)
)

result = result.join(df2.set_index("Substring"), on="Substring")

您的
df2
有多长?如果不太长的话,一个循环可能会有帮助。它不太长,我可以为此做一个循环。但我可能会将此应用到另一个未来的进程中,该表会更长(df1可能有几百万行,df2可能有几百行)。您的
df2
有多长?如果不太长的话,一个循环可能会有帮助。它不太长,我可以为此做一个循环。但我可能会将其应用到另一个未来的进程中,该表会更长(df1可能会有几百万行,df2可能会有几百行)。很好,这是可行的,我没有想到排序。很好,这是可行的,我没有想到排序。