当前位置: 首页 > 面试题库 >

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

莘睿
2023-03-14
问题内容

通常,我要负责对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。我不知道哪种方法是正确的使用方法,或者它们之间有什么区别(如果有的话),就造成了困惑。

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


问题答案:

跳至TLDR;在此答案的底部,简要介绍了不同之处。

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

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

OTOH .replace
更像是一种万能的瑞士军刀,可以用 任何其他东西 代替
任何 东西 (是的,这包括字符串和正则表达式)。

考虑下面的简单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中替换值,则也可以replace作为DataFrame方法访问)df.replace()

# 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.replacerepl可以是可调用的(请参阅文档),因此使用regex可以发挥创意,可以在某种程度上模拟多个子字符串的替换,但是这些解决方案充其量是不可靠的。

常见的pandaic(可拼凑,潘多尼克)模式是str.replace通过使用regex OR
pipe分隔子字符串来删除多个不需要的子字符串|,而替换字符串为''(空字符串)。

replace当您具有repl2格式多个独立
替换项时,应该首选。有多种方法可以指定独立的替换项(列表,系列,字典等)。请参阅文档。{'pat1': 'repl1', 'pat2':``, ...}

为了说明差异,

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,也可以做到replace。但是,重要的是要注意两种方法的默认行为之间的以下差异。

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

对比之间的区别

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。因此,例如,df.replace({'foo': 'bar', 1: -1},regex=True)它将是无效的。

总而言之,主要区别是

  1. 目的 。使用str.replace对一个字符串列串替换,并replace在一个或多个列任何一般更换。

  2. 用法str.replace一次可以替换一件东西。replace使您可以执行多个独立替换,即一次替换很多东西。

  3. 默认行为
    str.replace默认情况下启用正则表达式替换。replace除非使用此regex=True开关,否则仅执行完全匹配。



 类似资料:
  • 问题内容: 两者都意味着空间,但是有什么区别吗? 问题答案: 一个是不间断空间,另一个是常规空间。不间断的空格表示该行不应在该点处换行,就像它不会在一个单词的中间换行一样。 此外,正如斯文德(Svend)在其评论中指出的那样,不间断的空间不会崩溃。

  • 本文向大家介绍<%# %> 和 <% %> 有什么区别?相关面试题,主要包含被问及<%# %> 和 <% %> 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 答:<%# %>表示绑定的数据源 <%%>是服务器端代码块  

  • 问题内容: 以下代码之间有什么区别: 和 Python建议采用一种做事方式,但有时似乎不止一种。 问题答案: 一个是函数调用,一个是文字: 使用第二种形式。它更具Python风格,并且可能更快(因为它不涉及加载和调用单独的函数)。

  • 发展至今(2020 年 6 月份),GCC 编译器已经更新至 10.1.0 版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ 。 除此之外,当下的 GCC 编译器还支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序,甚至于 GCC 6 以及之前的版本还支持编译 Java 程序。但本

  • 问题内容: 比较PMD和CheckStyle有一个问题。但是,我找不到关于PMD和FindBugs之间差异/相似性的详尽分类。我相信一个关键的区别是PMD适用于源代码,而FindBugs适用于编译的字节码文件。但是就功能而言,这应该是一个选择,还是两者相辅相成? 问题答案: 我同时使用。我认为他们是相辅相成的。 正如您所说,PMD在源代码上工作,因此会发现诸如以下问题:违反命名约定,缺少花括号,放

  • 问题内容: 我被要求在portlet和门户网站上工作。 我想知道portlet和servlet之间的区别吗? Portlet与Servlet有何不同之处(可能在功能上)? 问题答案: Portlet是JSR-168标准的一部分,该标准规范门户容器和组件。这与Web容器(和Servlet)的标准不同。尽管这两个标准之间肯定有很强的相似之处,但是它们在容器,API,生命周期,配置,部署等方面有所不同。