使用宽松的字典映射列中的值

时间:2018-10-11 06:55:57

标签: python string pandas dictionary series

我想知道是否有人可以帮助我将字符串列与python中的宽松字典匹配。所以我有以下python数据框:

String                      Colour
8392apple8309
8dbsfhorange9anld
38banananflks9

和这本字典:

_dict
{'apple':'Red',
'orange':'Orange'
'banana':'Yellow'}

我已经编写了此功能:

def fruitsearch(string):
    return [value for key, value in _dict.items() if string in key.lower()]

可以接受我的键的子字符串,例如fruitsearch('app')并返回正确的颜色,红色。但是,我想做的就是让该函数在我的数据框“字符串”列中找到键,然后将正确的颜色返回到数据框的第二列,即颜色,所以它看起来像这样:

String                        Colour
8392apple8309                 Red
8dbsfhorange9anld             Orange
38banananflks9                Yellow

谢谢!

2 个答案:

答案 0 :(得分:6)

这是一种方法。

演示:

import pandas as pd


def fruitsearch(string):
    _dict = {'apple':'Red', 'orange':'Orange', 'banana':'Yellow'}
    for key, value in _dict.items():
        if key.lower() in string:
            return value 
    return None


df = pd.DataFrame({"String": ["8392apple8309", "8dbsfhorange9anld", "38banananflks9"]})
df["Colour"] = df["String"].apply(fruitsearch)

print(df)

输出:

              String  Colour
0      8392apple8309     Red
1  8dbsfhorange9anld  Orange
2     38banananflks9  Yellow

答案 1 :(得分:1)

当前,您正在按计算迭代字典。为了提高效率(尤其是在行数很大的情况下),请为每个字典项考虑 column-wise 操作。在这种情况下,您可以使用pd.Series.str.contains并提供参数regex=False来提高性能。

for k, v in _dict.items():
    df.loc[df['String'].str.contains(k, regex=False), 'Colour'] = v

print(df)

              String  Colour
0      8392apple8309     Red
1  8dbsfhorange9anld  Orange
2     38banananflks9  Yellow