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列中。
我在想匹配必须以某种方式捕获列表中匹配单词的索引,然后使用索引号提取值,但是我不知道该怎么做。
任何帮助或指针将不胜感激
谢谢
您可以使用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)
您可以使用提取并过滤掉那些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)
| 归档时间: |
|
| 查看次数: |
866 次 |
| 最近记录: |