熊猫:更高效的.map()函数或方法?

时间:2013-03-15 05:37:25

标签: python pandas

我正在使用一个包含大约3700万个数据点的相当大的数据集,这些数据点被分层索引到三个类别country,productcode,year。国家变量(国家名称)是相当混乱的数据,包括如下项目:'Austral'代表'Australia'。我已经构建了一个简单的guess_country(),它将字母与单词匹配,并从已知的country_names列表中返回最佳猜测和置信区间。鉴于数据的长度和层次结构的性质,将.map()用于Series:country是非常低效的。 [guess_country函数需要〜2ms / request]

我的问题是:是否有一个更高效的.map(),它接受系列并仅在唯一值上执行映射? (鉴于有很多重复的国家名称)

3 个答案:

答案 0 :(得分:3)

没有,但如果你只想申请独特的价值观,那就自己做吧。获取mySeries.unique(),然后使用您的函数预先计算这些唯一值的映射替代值,并使用生成的映射创建字典。然后将pandas map与字典一起使用。这应该和你期望的一样快。

答案 1 :(得分:0)

On Solution就是利用DataFrame中的Hierarchical Indexing!

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])) 

这很有效......通过替换data.index.levels [0] - >当COUNTRY在索引中为0级时,替换然后通过数据模型传播。

答案 2 :(得分:0)

在唯一的国家/地区名称上调用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)