我有tabe我必须在NY映射两个值,CAits国内,WT它的外部,除了它有海外
di = {"NY": "Domestic","CA": "Domestic","WT":"OUTSIDE"}
df.replace({'Territory': di})如何在上面的代码中给出OVERSEAS。因此,默认情况下,它(字典中没有任何内容)到海外
发布于 2020-04-28 20:08:29
如果没有匹配值,则使用返回缺少值的Series.map,因此添加了用于将其替换为默认值的Series.fillna:
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发布于 2020-05-07 06:06:18
虽然jezrael's answer可以工作,但它比所需的要慢,因为它必须首先进行映射,然后返回并填充缺少的元素。如果我们转而利用Python的内置字典,我们可以显着提高性能。
有两种方法可以利用python的字典对象的灵活性,您可以使用它们来创建默认值。一种是在映射字典上使用get method,另一种是使用defaultdict object from collections。如上所述,get和defaultdict方法的优点在于,它们避免了在映射之后必须回顾整个系列来替换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中仅仅映射带有缺失词条的字典似乎是很慢的。
%timeit df['Territory'].map(di)
>>> 372 µs ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)https://stackoverflow.com/questions/61479772
复制相似问题