标准Python dicts附带get
方法,如果找不到相应的键,可以指定映射值。是否有任何这样的方法将地图应用于Pandas系列,以便我可以替换后备值?
作为一种解决方法,我看到了两种可能实现此效果的路由:通过使用元素明智apply
手动调用dict的get方法,或者链接map
后跟fillna
这两者都具有矢量化操作的优点。然而,这仍然是两个操作,而不是我认为仍然优于大数据集的应用调用的操作。如果我能用一次调用完成这项工作就更好了,只是不确定是否可能。
import pandas
df = pandas.DataFrame( { 'a':['a1','a2','a3'] } )
mapDict = {'az':'nothing' , 'a1':'hitit'}
df['aSeriesMap'] = df['a'].map( mapDict )
df['aSeriesMapFill'] = df['a'].map( mapDict ).fillna( 'NoKeyValue' )
df['applyMap'] = df['a'].apply( lambda r : mapDict.get( r , 'NoKeyValue' ) )
>>> df
a aSeriesMap aSeriesMapFill applyMap
0 a1 hitit hitit hitit
1 a2 NaN NoKeyValue NoKeyValue
2 a3 NaN NoKeyValue NoKeyValue
答案 0 :(得分:2)
为什么不测试它们:
In [11]: df = pd.concat([df] * 10**4, ignore_index=True)
In [12]: df.shape
Out[12]: (30000, 1) # NOTE: our DF has 30.000 rows
In [13]: %timeit df['a'].map( mapDict )
4.9 ms ± 320 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [14]: %timeit df['a'].map( mapDict ).fillna( 'NoKeyValue' )
9.65 ms ± 806 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [15]: %timeit df['a'].apply( lambda r : mapDict.get( r , 'NoKeyValue' ) )
21.7 ms ± 96.5 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
还有一个选择:
In [24]: %timeit np.where(df['a'].isin( mapDict ), df['a'].map( mapDict ), 'NoKeyValue')
6.97 ms ± 13.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)