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

Posted

技术标签:

【中文标题】使用宽松字典映射列中的值【英文标题】:Using relaxed dictionary to map values in column 【发布时间】:2019-03-16 04:19:31 【问题描述】:

我想知道是否有人可以帮助我将一列字符串与 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

谢谢!

【问题讨论】:

【参考方案1】:

这是一种方法。

演示:

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

【讨论】:

【参考方案2】:

目前您正在逐行计算中迭代您的字典。为了提高效率,尤其是在有大量行的情况下,请考虑对每个字典项进行按列 操作。在这种情况下,您可以使用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

【讨论】:

感谢您的建议,这真的很有帮助!

以上是关于使用宽松字典映射列中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中

从数据库列和 C# 中的 textBox 值中扣除值,扣除后的值必须存储在新列中

如何将嵌套字典列表与它们的值中的公共键相加? [复制]

将字典映射到数据框列中的列表

如何在使用 SQL 的重复搜索中排除其他值中的值

在 VBA 中的字典值中查找最大值/最小值