pandas之替换函数
一般而言,替换操作是针对某一个列进行的,因此下面的例子都以 Series 举例。 pandas 中的替换函数可以归纳为三类:映射替换、逻辑替换、数值替换。
其中映射替换
包含 replace 方法、str.replace 方法以及 cat.codes 方法,此处介绍 replace 的用法。
在 replace 中,可以通过字典构造,或者传入两个列表来进行替换:
In [67]: df['Gender'].replace({'Female':0, 'Male':1}).head()
Out[67]:
0 0
1 1
2 1
3 0
4 1
Name: Gender, dtype: int64
In [68]: df['Gender'].replace(['Female', 'Male'], [0, 1]).head()
Out[68]:
0 0
1 1
2 1
3 0
4 1
Name: Gender, dtype: int64
另外, replace 还有一种特殊的方向替换,指定 method 参数为 ffill 则为用前面一个最近的未被替换的值进行替换, bfill 则使用后面最近的未被替换的值进行替换。从下面的例子可以看到,它们的结果是不同的:
In [69]: s = pd.Series(['a', 1, 'b', 2, 1, 1, 'a'])
In [70]: s.replace([1, 2], method='ffill')
Out[70]:
0 a
1 a
2 b
3 b
4 b
5 b
6 a
dtype: object
In [71]: s.replace([1, 2], method='bfill')
Out[71]:
0 a
1 b
2 b
3 a
4 a
5 a
6 a
dtype: object
逻辑替换
包括了 where 和 mask ,这两个函数是完全对称的: where 函数在传入条件为 False 的对应行进行替换,而 mask 在传入条件为 True 的对应行进行替换,当不指定替换值时,替换为缺失值。
In [72]: s = pd.Series([-1, 1.2345, 100, -50])
In [73]: s.where(s<0)
Out[73]:
0 -1.0
1 NaN
2 NaN
3 -50.0
dtype: float64
In [74]: s.where(s<0, 100)
Out[74]:
0 -1.0
1 100.0
2 100.0
3 -50.0
dtype: float64
In [75]: s.mask(s<0)
Out[75]:
0 NaN
1 1.2345
2 100.0000
3 NaN
dtype: float64
In [76]: s.mask(s<0, -50)
Out[76]:
0 -50.0000
1 1.2345
2 100.0000
3 -50.0000
dtype: float64
需要注意的是,传入的条件只需是与被调用的 Series 索引一致的布尔序列即可:
In [77]: s_condition= pd.Series([True,False,False,True],index=s.index)
In [78]: s.mask(s_condition, -50)
Out[78]:
0 -50.0000
1 1.2345
2 100.0000
3 -50.0000
dtype: float64
数值替换
包含了 round, abs, clip 方法,它们分别表示按照给定精度四舍五入、取绝对值和截断:
In [79]: s = pd.Series([-1, 1.2345, 100, -50])
In [80]: s.round(2)
Out[80]:
0 -1.00
1 1.23
2 100.00
3 -50.00
dtype: float64
In [81]: s.abs()
Out[81]:
0 1.0000
1 1.2345
2 100.0000
3 50.0000
dtype: float64
In [82]: s.clip(0, 2) # 前两个数分别表示上下截断边界
Out[82]:
0 0.0000
1 1.2345
2 2.0000
3 0.0000
dtype: float64
在 clip 中,超过边界的只能截断为边界值。