Python-从列表中搜索数据框内的字符串

Big*_*Daz 4 python dataframe pandas

我有以下清单:

search_list = ['STEEL','IRON','GOLD','SILVER']
Run Code Online (Sandbox Code Playgroud)

我需要在数据框(df)中进行搜索:

      a    b             
0    123   'Blah Blah Steel'
1    456   'Blah Blah Blah'
2    789   'Blah Blah Gold'
Run Code Online (Sandbox Code Playgroud)

并将匹配的行插入新的数据帧(newdf),并从列表中添加带有匹配词的新列:

      a    b                   c
0    123   'Blah Blah Steel'   'STEEL'
1    789   'Blah Blah Gold'    'GOLD'
Run Code Online (Sandbox Code Playgroud)

我可以使用以下代码提取匹配的行:

newdf=df[df['b'].str.upper().str.contains('|'.join(search_list),na=False)]
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将列表中的匹配词添加到c列中。

我在想匹配必须以某种方式捕获列表中匹配单词的索引,然后使用索引号提取值,但是我不知道该怎么做。

任何帮助或指针将不胜感激

谢谢

bus*_*ear 5

您可以使用set.intersection查找列中出现的单词b

search_list = set(['STEEL','IRON','GOLD','SILVER'])
df['c'] = df['b'].apply(lambda x: set.intersection(set(x.upper().split(' ')), search_list))
Run Code Online (Sandbox Code Playgroud)

输出:

     a                b        c
0  123  Blah Blah Steel  {STEEL}
1  456   Blah Blah Blah       {}
2  789   Blah Blah Gold   {GOLD}
Run Code Online (Sandbox Code Playgroud)

df[df['c'].astype(bool)]如果您想删除没有匹配的行,请使用

     a                b        c
0  123  Blah Blah Steel  {STEEL}
2  789   Blah Blah Gold   {GOLD}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ejo 5

您可以使用提取并过滤掉那些nan(即不匹配)的内容:

search_list = ['STEEL','IRON','GOLD','SILVER']

df['c'] = df.b.str.extract('({0})'.format('|'.join(search_list)), flags=re.IGNORECASE)
result = df[~pd.isna(df.c)]

print(result)
Run Code Online (Sandbox Code Playgroud)

输出量

              a       b      c
123 'Blah  Blah  Steel'  Steel
789 'Blah  Blah   Gold'   Gold
Run Code Online (Sandbox Code Playgroud)

请注意,您必须导入re模块才能使用该re.IGNORECASE标志。作为替代,您可以2直接使用re.IGNORECASE标志的值。

更新

如@ user3483203所述,您可以使用以下方法保存导入:

df['c'] = df.b.str.extract('(?i)({0})'.format('|'.join(search_list)))
Run Code Online (Sandbox Code Playgroud)

  • 您不需要额外的导入,`df.b.str.extract('(?i)({0})'。format('|'.join(search_list)))`可以正常工作 (2认同)