pandas系列是否有'get'之类的映射方法?

时间:2017-10-30 19:26:19

标签: python pandas

标准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

1 个答案:

答案 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)