使用宽松字典映射列中的值
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
【讨论】:
感谢您的建议,这真的很有帮助!以上是关于使用宽松字典映射列中的值的主要内容,如果未能解决你的问题,请参考以下文章
如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中