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

2024-10-16 22:28:44 发布

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

我有一个表,我必须在纽约映射两个值,CAits国内值,WT外部值,除此之外,它必须在海外映射

di = {"NY": "Domestic","CA": "Domestic","WT":"OUTSIDE"}

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

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


Tags: 代码df字典情况replacecawtdi
2条回答

使用^{}返回不匹配值的缺失值,因此添加了^{}以将其替换为默认值:

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

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

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

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

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

支持此方法性能的一些时间安排包括:

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中只映射一个缺少术语的dict似乎很慢

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

相关问题 更多 >