Series.replace和Series.str.replace有什么区别?

时间:2019-06-17 05:09:13

标签: python pandas replace

通常我的任务是对Series或DataFrames列中的数据执行某种替换或替换操作。

例如,给定一系列字符串,

s = pd.Series(['foo', 'another foo bar', 'baz'])

0                foo
1    another foo bar
2                baz
dtype: object

目标是将所有出现的“ foo”替换为“ bar”,以获得

0                bar
1    another bar bar
2                baz
Name: A, dtype: object

在这一点上,我通常会感到困惑,因为可以使用两个选项来解决此问题:replacestr.replace。造成混淆的原因是,我不确定使用哪种方法正确,或者它们之间有什么区别(如果有)。

replacestr.replace之间的主要区别是什么?使用这两种方法的优点/缺点是什么?

2 个答案:

答案 0 :(得分:12)

  

跳至TLDR;在此答案的底部,简要了解   差异。

如果您从实用性的角度考虑这两种方法,则很容易理解它们之间的区别。

.str.replace 是一种具有非常特定目的的方法-对 string 数据执行字符串或正则表达式替换。

OTOH, .replace 更具通用性,Swiss Army knife可以用其他代替任何 (是的,这包括字符串和正则表达式)。

考虑下面的简单DataFrame,这将构成我们即将进行的讨论的基础。

# Setup
df = pd.DataFrame({
    'A': ['foo', 'another foo bar', 'baz'],
    'B': [0, 1, 0]
})
df

                 A  B
0              foo  0
1  another foo bar  1
2              baz  0

这两个功能之间的主要区别可以归纳为

  1. 目的
  2. 用法
  3. 默认行为

在单个字符串列上使用str.replace替换子字符串,在一个或多个列上使用replace进行常规替换。

文档市场str.replace作为“简单字符串替换”的一种方法,因此在对熊猫系列或列执行字符串/正则表达式替换时,这应该是您的首选-可以将其视为“矢量化”等效项到python的字符串replace()函数(或更准确地说,是re.sub())。

# simple substring replacement
df['A'].str.replace('foo', 'bar', regex=False)

0                bar
1    another bar bar
2                baz
Name: A, dtype: object

# simple regex replacement
df['A'].str.replace('ba.', 'xyz')

0                foo
1    another foo xyz
2                xyz
Name: A, dtype: object

replace适用于字符串替换和非字符串替换。而且,这还意味着一次**可以处理多个列(如果您需要在整个DataFrame中替换值,则也可以作为DataFrame方法replace访问df.replace()。 / p>

# DataFrame-wide replacement
df.replace({'foo': 'bar', 1: -1})

                 A  B
0              bar  0
1  another foo bar -1
2              baz  0

str.replace一次可以替换一件事。 replace可让您执行多个独立的替换操作,即一次替换很多东西。

您只能为str.replace指定单个子字符串或正则表达式模式。 repl可以被调用(请参阅文档),因此使用regex可以发挥创意,可以在某种程度上模拟多个子字符串的替换,但是这些解决方案充其量是不可靠的。

常见的熊猫式(可拼装,潘多尼克)模式是使用str.replace通过使用正则表达式OR管道|分隔子字符串来删除多个不需要的子字符串,替换字符串为{{1} }(空字符串)。

如果您以格式'' repl2 replace进行多个独立替换,则首选

{'pat1': 'repl1', 'pat2':。有多种方法可以指定独立的替换项(列表,系列,字典等)。请参见documentation

为说明区别,

, ...}

最好表达为

df['A'].str.replace('foo', 'text1').str.replace('bar', 'text2')

0                  text1
1    another text1 text2
2                    baz
Name: A, dtype: object

在字符串操作的上下文中, df['A'].replace({'foo': 'text1', 'bar': 'text2'}, regex=True) 0 text1 1 another text1 text2 2 baz Name: A, dtype: object 默认启用正则表达式替换。除非使用str.replace开关,否则replace仅执行完全匹配。

使用regex=True所做的一切,也可以使用str.replace进行。但是,重要的是要注意两种方法的默认行为之间的以下差异。

  1. 子字符串替换-replace将替换每次出现的子字符串,str.replace默认情况下仅执行整个单词匹配
  2. 正则表达式替换-replace会将第一个参数解释为正则表达式,除非您指定str.replaceregex=False正好相反。

对比之间的差异

replace

还有

df['A'].replace('foo', 'bar')

0                bar
1    another foo bar
2                baz
Name: A, dtype: object

值得一提的是,df['A'].replace('foo', 'bar', regex=True) 0 bar 1 another bar bar 2 baz Name: A, dtype: object 时您只能 执行字符串替换。因此,例如regex=True无效。


TLDR;

总结一下,主要区别是

  
      
  1. 目的df.replace({'foo': 'bar', 1: -1}, regex=True)用于单个字符串列上的子字符串替换,str.replace用于一个或多个上的任何常规替换   列。

  2.   
  3. 用法replace一次可以替换一件事。 str.replace可让您执行多个独立的替换操作,即替换许多内容   一次。

  4.   
  5. 默认行为replace默认启用正则表达式替换。除非使用str.replace开关,否则replace仅执行完全匹配。

  6.   

答案 1 :(得分:0)

如果您将str.replacereplace进行比较,我会假设您正在考虑仅替换字符串。

两个有用的经验法则(尤其是在使用.apply()lambda时)是:

  1. 如果您想一次更换许多东西,请使用df.replace({dict})。请记住cs95docs中提到的默认设置。
  2. 如果要使用正则表达式和区分大小写选项,请使用str.replace()lambda x: x.str.replace('^default$', '', regex = True, case = False)

要注意的最后一件事是inplace参数仅在replace函数中可用,而在str.replace中不可用,这可能是代码中的决定因素,尤其是在链接时