首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将这些值重新映射到其他值,并提供默认值

将这些值重新映射到其他值,并提供默认值
EN

Stack Overflow用户
提问于 2020-04-28 20:04:58
回答 2查看 310关注 0票数 4

我有tabe我必须在NY映射两个值,CAits国内,WT它的外部,除了它有海外

代码语言:javascript
复制
di = {"NY": "Domestic","CA": "Domestic","WT":"OUTSIDE"}

df.replace({'Territory': di})

如何在上面的代码中给出OVERSEAS。因此,默认情况下,它(字典中没有任何内容)到海外

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-28 20:08:29

如果没有匹配值,则使用返回缺少值的Series.map,因此添加了用于将其替换为默认值的Series.fillna

代码语言:javascript
复制
df = pd.DataFrame({'Territory':['NY','CA','WT','SK','DE']})
di = {"NY": "Domestic","CA": "Domestic","WT":"OUTSIDE"}
print (df)
  Territory
0        NY
1        CA
2        WT
3        SK
4        DE

df['Territory'] = df['Territory'].map(di).fillna('OVERSEAS')
print (df)
  Territory
0  Domestic
1  Domestic
2   OUTSIDE
3  OVERSEAS
4  OVERSEAS
票数 6
EN

Stack Overflow用户

发布于 2020-05-07 06:06:18

虽然jezrael's answer可以工作,但它比所需的要慢,因为它必须首先进行映射,然后返回并填充缺少的元素。如果我们转而利用Python的内置字典,我们可以显着提高性能。

有两种方法可以利用python的字典对象的灵活性,您可以使用它们来创建默认值。一种是在映射字典上使用get method,另一种是使用defaultdict object from collections。如上所述,getdefaultdict方法的优点在于,它们避免了在映射之后必须回顾整个系列来替换NAs,而是在映射步骤本身中进行。

因此,简而言之,我建议:

代码语言:javascript
复制
df = pd.DataFrame({'Territory':['NY','CA','WT','SK','DE']})
di = {"NY": "Domestic","CA": "Domestic","WT":"OUTSIDE"}
df['Territory'] = df['Territory'].map(lambda x: di.get(x, 'OVERSEAS'))

支持此方法性能的一些计时是:

代码语言:javascript
复制
df = pd.DataFrame({'Territory':['NY','CA','WT','SK','DE']})
di = {"NY": "Domestic","CA": "Domestic","WT":"OUTSIDE"}

%timeit df['Territory'].map(lambda x: di.get(x, 'OVERSEAS'))
>>> 138 µs ± 1.35 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

from collections import defaultdict
dd = defaultdict(lambda:'OVERSEAS')
dd.update(di)   
%timeit df['Territory'].map(di)
>>> 143 µs ± 2.17 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit df['Territory'] = df['Territory'].map(di).fillna('OVERSEAS')
>>> 657 µs ± 33.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

对于较大的字典,性能上的差异变得更加明显:

同样有趣的是,如果你没有默认值,那么在Pandas中仅仅映射带有缺失词条的字典似乎是很慢的。

代码语言:javascript
复制
%timeit df['Territory'].map(di)
>>> 372 µs ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61479772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档