我有一个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'])
答案 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