首页 > 解决方案 > 修改 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)

标签: pythonpandasdataframe

解决方案


您可以为此任务使用一些列表理解来查看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

推荐阅读