gpt4 book ai didi

python - 在 Python 中用字典键(具有多个值)替换文本 - 效率更高

转载 作者:行者123 更新时间:2023-12-02 02:08:58 25 4
gpt4 key购买 nike

我一直在尝试用基于多个值的字典中的键替换 Pandas 数据框列中的部分文本;虽然我已经达到了预期的结果,但在大型数据集中,过程或循环非常非常慢。如果有人可以建议我采用更“Pythonic”的方式或更有效的方式来实现结果,我将不胜感激。请看下面的例子:

df =  pd.DataFrame({'Dish':  ['A', 'B','C'],
'Price': [15,8,20],
'Ingredient': ['apple banana apricot lamb ', 'wheat pork venison', 'orange lamb guinea']
})
<表类="s-表"><头>菜肴价格成分<正文>一个15苹果香蕉杏羊肉B8小麦 pig 肉鹿肉C20几内亚橙色羊肉

字典如下:

CountryList = {'FRUIT': [['apple'], ['orange'],  ['banana']],
'CEREAL': [['oat'], ['wheat'], ['corn']],
'MEAT': [['chicken'], ['lamb'], ['pork'], ['turkey'], ['duck']]}

我正在尝试用基于字典值的键替换“成分”列中的文本。例如,第一行的'apple'将被替换为字典键:'FRUIT'..所需的表如下所示:

<表类="s-表"><头>菜肴价格成分<正文>一个15水果水果杏肉B8 Cereal 肉鹿肉C20几内亚果肉

我在这里看到了一些相关的查询,其中每个键都有一个值;但在这种情况下,字典中的任何给定键都有多个值。到目前为止,我已经能够达到预期的结果,但是在处理大型数据集时速度非常慢。到目前为止,我用来实现结果的代码如下所示:

countries = list(CountryList.keys())

for country in countries:
for i in range(len(CountryList[country])):
lender = CountryList[country][i]
country = str(country)
lender = str(lender).replace("['",'',).replace("']",'')
df['Ingredient'] = df['Ingredient'].str.replace(lender,country)

也许这可以通过多处理来实现?不用说,我对 Python 的了解还有很多不足之处。

如有任何加快流程的建议,我们将不胜感激。

提前致谢

编辑:补充一下,有些键在字典中有超过 60000 个值;字典中有大约 200 个键,这使得代码在时间上非常低效。

最佳答案

改变国家列表的格式:

import itertools

CountryList2 = {}
for k, v in CountryList.items():
for i in (itertools.chain.from_iterable(v)):
CountryList2[i] = k
>>> CountryList2
{'apple': 'FRUIT',
'orange': 'FRUIT',
'banana': 'FRUIT',
'oat': 'CEREAL',
'wheat': 'CEREAL',
'corn': 'CEREAL',
'chicken': 'MEAT',
'lamb': 'MEAT',
'pork': 'MEAT',
'turkey': 'MEAT',
'duck': 'MEAT'}

现在你可以使用replace:

df['Ingredient'] = df['Ingredient'].replace(CountryList2, regex=True)
>>> df
Dish Price Ingredient
0 A 15 FRUIT FRUIT apricot MEAT
1 B 8 CEREAL MEAT venison
2 C 20 FRUIT MEAT guinea

关于python - 在 Python 中用字典键(具有多个值)替换文本 - 效率更高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67959404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com