DataFrame.replace(self, to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad') [source]
将to_replace
中给出的值替换为value
。
DataFrame
的值被动态替换为其他值。这与使用.loc
或.iloc
进行更新不同,后者要求您指定要使用某个值进行更新的位置。
参数: | to_replace :
如何找到将要被替换的值。 numeric, str 或 regex: 1)numeric: 等于 2)str: 完全匹配 3)regex: 匹配 str, regex, 或 numeric的list: 1)首先,如果 那么它们的长度必须相同。 2)其次,如果 那么两个列表中的所有字符串都将被解释为 否则它们将直接匹配。这对值没有太大影响, 因为您只能使用几种可能的替代正则表达式。 3) dict : 1) 例如, 将值 要以这种方式使用 2)对于数据格式, 例如,
并用
您可以将此看作传递两个列表的特殊情况。 3)对于一个 用于DataFrame嵌套字典, 例如, 读取如下 并将其替换为 要以这种方式使用嵌套的 您也可以嵌套正则表达式。 注意列名(嵌套字典中的顶级字典键)不能是正则表达式。 None: 1)这意味着 编译 如果值也是 请参阅示例部分以获得这些示例。 value : scalar, dict, list, str, regex, 默认 None: 值,以替换与 对于DataFrame,可以使用一组值来指定为每个列使用哪个值 (不属于该数据格式的列将不会被填充)。 这些对象的正则表达式、字符串和列表或字典也是允许的。 inplace : 如果是真的,在适当的地方。 注意:这将修改这个对象上的任何其他视图(例如, DataFrame中的一个列)。如果为真,则返回调用者。 limit : 向前或向后填充的最大尺寸gap。 regex : 是否将 如果这是 也可以是正则表达式或正则表达式的列表、dict或数组, 在这种情况下 method : 当用于替换时,当 列表或元组,值为 在版本0.23.0中更改:添加到DataFrame中。 |
返回值: | DataFrame 更换后的对象。 |
Raises: | AssertionError 如果
1)如果 而值不是 2)如果 并且regex不能编译为正则表达式, 或者是 3)替换多个
如果一个列表或一个
但是它们的长度不相同。 |
Notes
1) 正则表达式替换在底层使用re.sub
执行。替换re.sub
的规则是相同的。
2) 正则表达式将只替换字符串,这意味着您不能提供匹配浮点数的正则表达式,也不能期望框架中具有数字dtype
的列被匹配。但是,如果这些浮点数是字符串,那么您可以这样做。
3) 这个方法有很多选项。我们鼓励您试验和尝试这种方法,以获得它如何工作的直觉。
4) 当使用dict
作为to_replace
值时,就像dict
中的键是to_replace
部分,而dict
中的值是值参数一样。
例子,
标量 “to_replace”和“value”
>>> s = pd.Series([0, 1, 2, 3, 4])
>>> s.replace(0, 5)
0 5
1 1
2 2
3 3
4 4
dtype: int64
>>> df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
... 'B': [5, 6, 7, 8, 9],
... 'C': ['a', 'b', 'c', 'd', 'e']})
>>> df.replace(0, 5)
A B C
0 5 5 a
1 1 6 b
2 2 7 c
3 3 8 d
4 4 9 e
类似list的“to_replace”
>>> df.replace([0, 1, 2, 3], 4)
A B C
0 4 5 a
1 4 6 b
2 4 7 c
3 4 8 d
4 4 9 e
>>> df.replace([0, 1, 2, 3], [4, 3, 2, 1])
A B C
0 4 5 a
1 3 6 b
2 2 7 c
3 1 8 d
4 4 9 e
>>> s.replace([1, 2], method='bfill')
0 0
1 3
2 3
3 3
4 4
dtype: int64
类似dict的“to_replace”
>>> df.replace({0: 10, 1: 100})
A B C
0 10 5 a
1 100 6 b
2 2 7 c
3 3 8 d
4 4 9 e
>>> df.replace({'A': 0, 'B': 5}, 100)
A B C
0 100 100 a
1 1 6 b
2 2 7 c
3 3 8 d
4 4 9 e
>>> df.replace({'A': {0: 100, 4: 400}})
A B C
0 100 5 a
1 1 6 b
2 2 7 c
3 3 8 d
4 400 9 e
正则表达式“to_replace”
>>> df = pd.DataFrame({'A': ['bat', 'foo', 'bait'],
... 'B': ['abc', 'bar', 'xyz']})
>>> df.replace(to_replace=r'^ba.$', value='new', regex=True)
A B
0 new abc
1 foo new
2 bait xyz
>>> df.replace({'A': r'^ba.$'}, {'A': 'new'}, regex=True)
A B
0 new abc
1 foo bar
2 bait xyz
>>> df.replace(regex=r'^ba.$', value='new')
A B
0 new abc
1 foo new
2 bait xyz
>>> df.replace(regex={r'^ba.$': 'new', 'foo': 'xyz'})
A B
0 new abc
1 xyz new
2 bait xyz
>>> df.replace(regex=[r'^ba.$', 'foo'], value='new')
A B
0 new abc
1 new new
2 bait xyz
注意,当替换多个bool或datetime64对象时,to_replace参数中的数据类型必须与被替换值的数据类型匹配:
>>> df = pd.DataFrame({'A': [True, False, True],
... 'B': [False, True, False]})
>>> df.replace({'a string': 'new value', True: False}) # raises
Traceback (most recent call last):
...
TypeError: Cannot compare types 'ndarray(dtype=bool)' and 'str'
这将引发类型错误,因为其中一个dict键不是用于替换的正确类型。
比较s的行为。替换({'a': None})
和s.replace('a', None)
了解to_replace
参数的特性:
>>> s = pd.Series([10, 'a', 'a', 'b', 'a'])
当使用dict
作为to_replace
值时,就像dict中的值等于value参数一样。s.replace({'a': None})
等价于s.replace(to_replace={'a': None}, value=None, method=None)
:
>>> s.replace({'a': None})
0 10
1 None
2 None
3 b
4 None
dtype: object
当value=None
和to_replace
是标量、列表或元组时,replace
使用方法参数(默认'pad'
)进行替换。这就是为什么在第1和第2行中'a'
值被替换为10
,在本例中在第4行中替换为'b'
。该命令s.replace('a', None)
实际上等于 s.replace(to_replace='a', value=None, method='pad'):
>>> s.replace('a', None)
0 10
1 10
2 10
3 b
4 b
dtype: object