我有一个字符串,其中包含(仅)几个子字符串之一。我想检查包含哪个子字符串并获取与其关联的值。这就是为什么我会用字典来做这个操作。
示例:
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的方法的进一步建议。
答案 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.join
将 dict.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。