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

0 投票
3 回答
3100 浏览
提问于 2025-04-17 19:11

我正在使用一个相当大的数据集,大约有3700万个数据点,这些数据点按照国家、产品代码和年份这三个类别进行分层索引。国家变量(也就是国家名称)数据比较杂乱,比如有个项叫'Austral',其实是指'Australia'(澳大利亚)。我写了一个简单的guess_country()函数,它能把字母匹配到单词,并从一个已知的国家名称列表中返回最佳猜测和置信区间。由于数据量大和层级结构的原因,使用.map()来处理国家这一列的数据效率非常低下。[这个guess_country函数每次请求大约需要2毫秒]

我想问的是:有没有更高效的.map()方法,可以只对唯一的值进行映射?(因为有很多重复的国家名称)

3 个回答

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

这样做效果很好……当COUNTRY在索引的第0层时,我们可以替换data.index.levels[0],这个替换会在数据模型中传播开来。

3

没有现成的办法,但如果你只想对唯一的值进行操作,可以自己动手做。首先,使用 mySeries.unique() 来获取唯一的值,然后用你的函数提前计算这些唯一值对应的替代值,并创建一个字典来存放这些对应关系。最后,使用 pandas 的 map 函数和这个字典。这样做的速度应该是你能期待的最快的了。

撰写回答