有没有办法做到这个Series.map到位?

时间:2013-11-12 02:40:14

标签: python optimization pandas

这里的场景是我有一个带有原始整数数据的数据帧,以及一个将这些int映射到字符串值的dict

我需要将数据框中的值替换为地图中的相应值,但如果它没有映射到任何内容,请保留原始值。

到目前为止,我能够找到如何做我想要的唯一方法是使用临时列。但是,由于我正在使用的数据大小,这有时会有点毛茸茸。所以,我想知道是否有一些技巧可以在熊猫中做到这一点,而不需要临时列......

import pandas as pd
import numpy as np

data = pd.DataFrame(np.random.randint(1,5, size=(100,1)))
map_array = {1:'one', 2:'two', 4:'four'}

data['__temp__'] = data[0].map(map_array, na_action=None) 
#I've tried varying the na_action arg to no effect

nan_index = data['__temp__'][data['__temp__'].isnull() == True].index
data['__temp__'].ix[nan_index] = data[0].ix[nan_index]
data[0] = data['__temp__']
data = data.drop(['__temp__'], axis=1)

1 个答案:

答案 0 :(得分:5)

我认为您只需使用.replace,无论是DataFrame还是Series

>>> df = pd.DataFrame(np.random.randint(1,5, size=(3,3)))
>>> df
   0  1  2
0  3  4  3
1  2  1  2
2  4  2  3
>>> map_array = {1:'one', 2:'two', 4:'four'}
>>> df.replace(map_array)
      0     1    2
0     3  four    3
1   two   one  two
2  four   two    3
>>> df.replace(map_array, inplace=True)
>>> df
      0     1    2
0     3  four    3
1   two   one  two
2  four   two    3

我不确定更改列dtypes的内存会是什么。