Python pandas.DataFrame.replace函数方法的使用

Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。本文主要介绍一下Pandas中pandas.DataFrame.replace方法的使用。

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

str, regex, list, dict,

Series, int, float,None

如何找到将要被替换的值。

numeric, str 或 regex:

1)numeric: 等于to_replace的数值将被替换为value

2)str: 完全匹配to_replace的字符串将被替换为值

3)regex: 匹配to_replace的正则表达式将被替换为值

str, regex, 或 numeric的list:

1)首先,如果to_replacevalue都是列表,

那么它们的长度必须相同。

2)其次,如果regex=True

那么两个列表中的所有字符串都将被解释为regex

否则它们将直接匹配。这对值没有太大影响,

因为您只能使用几种可能的替代正则表达式。

3)str、regexnumeric规则同样适用。

dict : 

1)dict可用于为不同的现有值指定不同的替换值。

例如,{'a': 'b', 'y': 'z'}将值'a'替换为'b'

将值'y'替换为'z'

要以这种方式使用dict, value参数应该为None

2)对于数据格式,dict可以指定在不同的列中替换不同的值。

例如,

{'a': 1, 'b': 'z'}查找列'a'中的值1和列'b'中的值'z'

并用value中指定的值替换这些值。在这种情况下,

value参数不应该是None。除了指定要搜索的列之外,

您可以将此看作传递两个列表的特殊情况。

3)对于一个DataFrame嵌套字典,

用于DataFrame嵌套字典,

例如,{'a': {'b': np.nan}}

读取如下:'a'列中查找值'b'

并将其替换为NaN

要以这种方式使用嵌套的dict, value参数应该为None

您也可以嵌套正则表达式。

注意列名(嵌套字典中的顶级字典键)不能是正则表达式。

None:

1)这意味着regex参数必须是字符串、

编译regexlistdictndarray或这类元素的Series。

如果值也是None,那么这必须是嵌套字典或序列。

请参阅示例部分以获得这些示例。

value : scalar, dict, list, str, regex, 默认 None:

值,以替换与to_replace匹配的任何值。

对于DataFrame,可以使用一组值来指定为每个列使用哪个值

(不属于该数据格式的列将不会被填充)。

这些对象的正则表达式、字符串和列表或字典也是允许的。

inplace :bool, 默认 False

如果是真的,在适当的地方。

注意:这将修改这个对象上的任何其他视图(例如,

DataFrame中的一个列)。如果为真,则返回调用者。

limit : int, 默认None

向前或向后填充的最大尺寸gap。

regex :bool或与to_replace相同的类型, 默认False

是否将to_replace/value解释为正则表达式。

如果这是True,那么to_replace必须是一个字符串。

也可以是正则表达式或正则表达式的列表、dict或数组,

在这种情况下to_replace必须为None

method :{‘pad’, ‘ffill’, ‘bfill’, None}

当用于替换时,当to_replace是标量时,

列表或元组,值为None时使用的方法。

在版本0.23.0中更改:添加到DataFrame中。

返回值:

DataFrame

更换后的对象。

Raises:

AssertionError

如果regex不是bool, to_replace不是None

TypeError

1)如果to_replace是一个dict

而值不是listdictndarraySeries

2)如果to_replaceNone

并且regex不能编译为正则表达式,

或者是listdictndarraySeries

3)替换多个booldatetime64对象时,

to_replace的参数与被替换值的类型不匹配

ValueError

如果一个列表或一个ndarray被传递给

to_replacevalue

但是它们的长度不相同。

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=Noneto_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

推荐阅读
cjavapy编程之路首页