【问题标题】:How to use str.replace to replace multiple pairs at once? [duplicate]如何使用 str.replace 一次替换多对? [复制]
【发布时间】:2020-10-07 07:29:21
【问题描述】:

目前我正在使用以下代码进行替换,这有点麻烦:

df1['CompanyA'] = df1['CompanyA'].str.replace('.','')
df1['CompanyA'] = df1['CompanyA'].str.replace('-','')
df1['CompanyA'] = df1['CompanyA'].str.replace(',','')
df1['CompanyA'] = df1['CompanyA'].str.replace('ltd','limited')
df1['CompanyA'] = df1['CompanyA'].str.replace('&','and')
df1['Address1A'] = df1['Address1A'].str.replace('.','')
df1['Address1A'] = df1['Address1A'].str.replace('-','')
df1['Address1A'] = df1['Address1A'].str.replace('&','and')
df1['Address1A'].str.replace(r'\brd\b', 'road')
df1['Address2A'] = df1['Address2A'].str.replace('.','')
df1['Address2A'] = df1['Address2A'].str.replace('-','')
df1['Address2A'] = df1['Address2A'].str.replace('&','and')
df1['Address2A'].str.replace(r'\brd\b', 'road')

为了使动态更改更容易,我的理想方案是:

df1['CompanyA'] = df1['CompanyA'].str.replace(('&','and'), ('.', ''), ('-','')....)
df1['Address1A'] = df1['Address1A'].str.replace(('&','and'), ('.', ''), ('-','')....)
df1['Address2A'] = df1['Address2A'].str.replace(('&','and'), ('.', ''), ('-','')....)

这样我就可以为特定列输入/更改我想要替换的内容,而无需调整多行代码。

这可能吗?

【问题讨论】:

  • 你试过写循环吗?

标签: python pandas string replace


【解决方案1】:

您可以创建一个字典并将其传递给函数replace(),而无需多次链接或命名该函数。

replacers = {',':'','.':'','-':'','ltd':'limited'} #etc....
df1['CompanyA'] = df1['CompanyA'].replace(replacers)

【讨论】:

  • 我喜欢这个简洁的答案,for循环也没有错,对python新手来说更具可读性和友好性
  • 是的,它对新手来说可能更易读和更友好,但是我不认为传递一个简单的字典太复杂。我想说字典应该在 for 循环和 pandas 一起学习之前,但这当然是一种观点,感谢您的评论。
  • 是的,但是知道你可以通过字典来替换与 pandas 或字典本身无关,这只是一些内部魔法,这是我的意思,虽然它看起来很干净
  • 太棒了!这正是我所追求的那种功能性。
  • 你能把字典传给replace()吗?我在这里很困惑。在 Python 3.8.5 中,评估 "abcdefghi".replace({'b':'B', 'g':'G'}) 会得到 TypeError: replace expected at least 2 arguments, got 1。我错过了什么吗?
【解决方案2】:

你很可能使用 pd.Dataframe 所以我建议制作通用卸妆

def remover(row, replaces):
    for k,v in replacers.items():
        if k in row:
            row = row.replace(k, v)
    return row      


replacers = {',' : "",
         '.':'',
         '-':'',
         'ltd':'limited'
        }

for column in df.columns:
    df[column] = df[column].apply(lambda row: remover(row, replacers))

或者您可以指定要修改的特定列名

【讨论】:

    【解决方案3】:

    您可以使用字典来映射每列的字符:

    to_replace = {'.': '',
                  ',': '',
                  'foo': 'bar'
                 }
    
    for k, v in to_replace.items():
        df1['CompanyA'] = df1['CompanyA'].str.replace(k, v)
    

    【讨论】:

    • 永远不要在 pandas 中使用循环它会破坏那里的所有生产力
    【解决方案4】:

    替换函数也接受值作为字典。你可以这样做:

    df1.replace({'CompanyA' : { '&' : 'and', '.': '' , '-': ''}},regex=True)
    

    【讨论】:

      【解决方案5】:

      你可以链接替换:

      df1['CompanyA'] = df1['CompanyA'].str.replace('.','').replace('-','').replace(',','').replace('ltd','limited').replace('&','and')
      ...
      

      【讨论】:

        猜你喜欢
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多