在replace()中,可以通过字典构造或者传入两个列表(分别表示需要替换的值和替换后的值)来进行替换:
In [60]: df['Gender'].replace({'Female':0, 'Male':1}).head()
Out[60]: 0 0
1 1
2 1
3 0
4 1
Name: Gender, dtype: int64
In [61]: df['Gender'].replace(['Female', 'Male'], [0, 1]).head()
Out[61]: 0 0
1 1
2 1
3 0
4 1
Name: Gender, dtype: int64
另外,replace()还可以进行一种特殊的方向替换,指定参数method为ffill时,用前面一个最近的未被替换的值进行替换,参数method为bfill时,则用后面最近的未被替换的值进行替换。从下面的例子可以看到,它们的结果是不同的:
In [62]: s = pd.Series(['a', 1, 'b', 2, 1, 1, 'a'])
s.replace([1, 2], method='ffill')
Out[62]: 0 a
1 a
2 b
3 b
4 b
5 b
6 a
dtype: object
In [63]: s.replace([1, 2], method='bfill')
Out[63]: 0 a
1 b
2 b
3 a
4 a
5 a
6 a
dtype: object
逻辑替换包括where()和mask(),这两个函数是相对应的:where()在传入条件为False的对应行进行替换,而mask()在传入条件为True的对应行进行替换,当未对二者指定替换值时,将对应行替换为缺失值。
In [64]: s = pd.Series([-1, 1.2345, 100, -50])
s.where(s<0)
Out[64]: 0 -1.0
1 NaN
2 NaN
3 -50.0
dtype: float64
In [65]: s.where(s<0, 100)
Out[65]: 0 -1.0
1 100.0
2 100.0
3 -50.0
dtype: float64
In [66]: s.mask(s<0)
Out[66]: 0 NaN
1 1.2345
2 100.0000
3 NaN
dtype: float64
In [67]: s.mask(s<0, -50)
Out[67]: 0 -50.0000
1 1.2345
2 100.0000
3 -50.0000
dtype: float64
需要注意的是,传入的条件只需要是布尔序列即可,但其索引应当与被调用的Series索引一致:
In [68]: s_condition= pd.Series([True,False,False,True],index=s.index)
s.mask(s_condition, -50)
Out[68]: 0 -50.0000
1 1.2345
2 100.0000
3 -50.0000
dtype: float64
数值替换包含round()、abs()和clip(),它们分别表示按照给定精度四舍五入、取绝对值和截断:
In [69]: s = pd.Series([-1, 1.2345, 100, -50])
s.round(2)
Out[69]: 0 -1.00
1 1.23
2 100.00
3 -50.00
dtype: float64
In [70]: s.abs()
Out[70]: 0 1.0000
1 1.2345
2 100.0000
3 50.0000
dtype: float64
In [71]: s.clip(0, 2) # 前两个数分别表示上下截断边界
Out[71]: 0 0.0000
1 1.2345
2 2.0000
3 0.0000
dtype: float64