python - 修改 DataFrame 时如何在字符串列表中查找部分匹配项
问题描述
我有一个数据框'df':
id value
0 ABC hi
1 XYZ hey
我想与字符串列表“str_list”进行比较:
str_list = ['abc_123', 'xyz_456']
如果在 str_list 中找到“id”上的部分匹配项,则查找部分匹配项以替换该值,以进行如下操作:
id value
0 ABC new_value
1 XYZ new_value
截至目前,我有这个代码:
df.loc[df['id'].isin(str_list), 'value'] = 'new_val'
但这仅适用于完全匹配(因此 df 'id' 值必须是 abc_123,xyz_456)才能看到添加的 new_vals。
如何修改它以接受部分匹配?
import pandas as pd
str_list = ['abc_123', 'xyz_456']
df = pd.DataFrame({'id':['ABC','XYZ'], 'value':['hi','hey']})
# this commented out df will trigger the matches correctly
#df = pd.DataFrame({'id':['abc_123','xyz_456'], 'value':['hi','hey']})
print(df)
df.loc[df['id'].isin(str_list), 'value'] = 'new_val'
print(df)
解决方案
您可以为此任务使用一些列表理解来查看lower()
您的数据框值是否在列表中。
import pandas as pd
str_list = ['abc_123', 'xyz_456']
df = pd.DataFrame({'id':['ABC','XYZ'], 'value':['hi','hey']})
df['match'] = df['id'].apply(lambda x: min([y for y in str_list if x.lower() in y]))
df
Out[1]:
id value match
0 ABC hi abc_123
1 XYZ hey xyz_456
推荐阅读
- python - 在python中找到两个列表之间匹配索引的最快方法?
- java - 'Users' 以外的集合中的 User.findOne()
- mysql - 当我运行此查询时,为什么其他参与者获得特定于其他参与者的值?
- regex - 正则表达式不匹配特定字符串,但需要额外检查
- javascript - 链接到不同页面中的部分不起作用
- android - 在 Flutter 中使用 showModalBottomSheet() 方法构建的底部工作表上显示的小部件中未更新变量
- java - 如何从 jTable 在 jSpinner 中设置值时间
- android - 使用标题和正文字段将多部分图像上传到服务器时出现颤振格式异常?
- ios - 表格视图中的分隔符(Swift)
- ruby - 如何从 zsh 安装和运行“hanami new bookshelf”