Python - 如果键包含在字符串中,则获取字典值

时间:2021-01-29 15:26:54

标签: python pandas string

我有一个字符串,其中包含(仅)几个子字符串之一。我想检查包含哪个子字符串并获取与其关联的值。这就是为什么我会用字典来做这个操作。

示例:

string_to_check = 'TEST13-872B-A22E'
substrings = {'TEST': 0, 'WORLD': 1, 'CORONA':2}

在这种情况下,应该返回 0。

背景是我有一个 Pandas DataFrame (df),其中有一列 string_to_check 充满了这些字符串。根据每行中包含的子字符串,我想为数据框的新列的相应行分配一个值。

示例结果:

string_to_check       result

'TEST13-872B-A22E'    0
'CORONA1-241-22E'     2
'TEST32-33A-442'      0
'WORLD4-BB2-A343'     1

我想我可以使用类似的东西

def check_string(string_to_check):
    for stri, val in zip(substrings.keys, substrings.values):
        if stri in string_to_check:
            return val

结合应用。但现在我觉得自己把这些碎片拼凑起来很愚蠢。

编辑:

好吧,我想我自己解决了这个问题:

def check_string(string_to_check):
    for stri, val in zip(substrings.keys(), substrings.values()):
        if stri in string_to_check:
            return val

df['result'] = df['string_to_check'].apply(check_string)

但我很高兴看到关于更短/更易读/更pythonic的方法的进一步建议。

3 个答案:

答案 0 :(得分:2)

对于第一个问题,使用dict comprehension迭代从dict.items()获得的键、值对,并检查键是否是in字典:

>>> string_to_check = 'TEST13-872B-A22E'
>>> substrings = {'TEST': 0, 'WORLD': 1, 'CORONA':2}

>>> [val for key, val in substrings.items() if key in string_to_check]
 [0]

但对于您的实际问题,您可以使用 str.joindict.keys()| 字符连接到 pandas.str.Series.extract substrings 中的 dict.values() , 然后 pandas.Series.map 结果为 substrings:

>>> df
      string_to_check
0  'TEST13-872B-A22E'
1   'CORONA1-241-22E'
2    'TEST32-33A-442'
3   'WORLD4-BB2-A343'

>>> df.assign(result=
           df.string_to_check
             .str.extract(f"({'|'.join(substrings.keys())})", expand=False)
             .map(substrings))

      string_to_check  result
0  'TEST13-872B-A22E'       0
1   'CORONA1-241-22E'       2
2    'TEST32-33A-442'       0
3   'WORLD4-BB2-A343'       1

答案 1 :(得分:2)

只有很少的建议

首先,在您的代码中,您可以将 zip(substrings.keys(), substrings.values()) 替换为 dict 类 substrings.items()items 方法。

然后,如果您愿意,可以在 apply 方法中使用 lambda 函数。此 lambda 函数产生所需的输出

lambda x: [val for key, val in substrings.items() if key in x][0]

请注意,如果 string_to_check 中不存在子字符串,则函数会因 [0] 而引发错误。

df['result'] = df['string_to_check'].apply(lambda x: [val for key, val in substrings.items() if key in x][0])

答案 2 :(得分:0)

for i in strings_to_check:
    to_return = []
    for j in substrings.keys():
        if j in i:
            to_return.append(substring[j])
            break
        to_return.append(-1)
            
return to_return

所有目标字符串都将存储在 strings_to_check 中,返回值是这些字符串的所有输出的列表,如果没有找到字符串的可行输出,则附加 -1。

相关问题