0

我正在使用一个相当大的数据集,其中包含约 3700 万个数据点,这些数据点按层次索引为国家、产品代码、年份三类。country 变量(即国家名称)是相当杂乱的数据,由以下项目组成:“Austral”,代表“Australia”。我已经构建了一个简单的guess_country(),它将字母与单词匹配,并从已知的country_names 列表中返回最佳猜测和置信区间。鉴于数据的长度和层次结构的性质,将 .map() 用于 Series: country 的效率非常低。[guess_country 函数需要 ~2ms / 请求]

我的问题是:是否有更有效的 .map() 采用系列并仅对唯一值执行映射?(鉴于有很多重复的国名)

4

3 回答 3

3

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

于 2013-03-15T05:41:50.687 回答
0

调用guess_country()唯一的国家名称,并以country_map原始名称为索引,转换后的名称为值,创建一个 Series 对象。然后你可以使用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)
于 2013-03-15T07:51:58.527 回答
0

解决方案是利用 DataFrame 中的分层索引!

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 级时,替换然后通过数据模型传播。

于 2013-03-15T05:46:40.103 回答