Pandas:效率更高的.map()函数还是方法?

2024-10-01 11:25:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是一个相当大的数据集,大约有3700万个数据点,这些数据点按层次分为三类:country、productcode和year。country变量(即countryname)是一个相当混乱的数据,由代表“Austral”的“Austral”等项组成。我构建了一个简单的guess_country(),它将字母与单词进行匹配,并从已知的国家名称列表中返回最佳猜测和置信区间。考虑到数据的长度和层次结构的性质,将.map()用于Series:country是非常低效的。[guess_country函数需要~2ms/请求]

我的问题是:有没有更高效的.map()来获取序列并只对唯一值执行映射?(考虑到有很多重复的国家名称)


Tags: 数据名称map列表字母代表国家单词
3条回答

对唯一的国家名称调用guess_country(),并创建一个country_map系列对象,原始名称作为索引,转换后的名称作为值。然后可以使用country_map[df.country]进行转换。在

import pandas as pd
c = ["abc","abc","ade","ade","ccc","bdc","bxy","ccc","ccx","ccb","ccx"]
v = range(len(c))
df = pd.DataFrame({"country":c, "data":v})

def guess_country(c):
    return c[0]

uc = df.country.unique()
country_map = pd.Series(list(map(guess_country, uc)), index=uc)
df["country_id"] = country_map[df.country].values
print(df)

解决方案是利用数据帧中的分层索引!在

data = data.set_index(keys=['COUNTRY', 'PRODUCTCODE', 'YEAR'])
data.index.levels[0] = pd.Index(data.index.levels[0].map(lambda x: guess_country(x, country_names)[0])) 

这很有效。。。通过替换数据索引级别[0]->;当国家/地区在索引中为0级时,则替换通过数据模型传播。在

没有,但是如果你只想应用于唯一值,那就自己去做。获取mySeries.unique(),然后使用函数为这些唯一值预先计算映射的替代项,并创建一个包含结果映射的字典。然后在字典中使用pandasmap。这应该和你所期望的一样快。在

相关问题 更多 >