根据python中的表/列表/数据框替换列中的确切子字符串

时间:2019-11-18 14:19:04

标签: python regex pandas

我有一个pandas数据框df,其中一列有一个字符串:

columnA
'PSX - Judge A::PSK-Ama'
'VSC - Jep::VSC-Da'
'VSO - Jep::VSO-Da'
...

还有另一个数据框,其中有新的字符串:

old new
PSX PCC
VSO VVV

我期望的结果是:

columnA
'PCC - Judge A::PCC-Ama'
'VSC - Jep::VSC-Da'
'VVV - Jep::VVV-Da'
...

我的想法是写:

import re
df['columnA'] = df.replace('PSX', 'PCC', regex=True)
df['columnA'] = df.replace('VSO', 'VVV', regex=True)

两个替换都可以,但是严重替换该怎么做?有更聪明的方法吗?

您在此处获得的数据帧(丹尼尔致谢):

df = pd.DataFrame(data=['PSX - Judge A::PSK-Ama',
                        'VSC - Jep::VSC-Da',
                        'VSO - Jep::VSO-Da'], columns=['columnA'])
replace = pd.DataFrame(data=[['PSX', 'PCC'],
                             ['VSO', 'VVV']], columns=['old', 'new'])

3 个答案:

答案 0 :(得分:1)

for row in df_map.iterrows():
    df['columnA'] = df.replace(row[0], row[1], regex=True)

df_map是您的映射DataFrame

答案 1 :(得分:1)

您可以使用替换参数可以是一个函数的事实:

import pandas as pd

df = pd.DataFrame(data=['PSX - Judge A::PSK-Ama',
                        'VSC - Jep::VSC-Da',
                        'VSO - Jep::VSO-Da'], columns=['columnA'])

replace = pd.DataFrame(data=[['PSX', 'PCC'],
                             ['VSO', 'VVV']], columns=['old', 'new'])

lookup = dict(zip(replace.old, replace.new))


def repl(w, lookup=lookup):
    return lookup.get(w.group(), w.group())


df['columnA'] = df['columnA'].str.replace('\w+', repl)

print(df)

输出

                  columnA
0  PCC - Judge A::PSK-Ama
1       VSC - Jep::VSC-Da
2       VVV - Jep::VVV-Da

想法是提取columnA中的单词,如果与查找中的单词匹配,则将其替换。这受answer的启发,基准测试表明这是更具竞争力的方法。

答案 2 :(得分:1)

您可以在第二个数据框中制作一个“替换字典”,然后遍历键和值,同时使用str.replace。这个解决方案应该很快:

replacements = dict(zip(df2['old'], df2['new']))

for k, v in replacements.items():
    df['columnA'] = df['columnA'].str.replace(k, v)
                  columnA
0  PCC - Judge A::PSK-Ama
1       VSC - Jep::VSC-Da
2       VVV - Jep::VVV-Da