我确定这个问题很容易回答,但是我无法确定要使用的正确字符串。我基本上想要用新域替换数据框中的任何电子邮件地址。对于特定列,请替换子字符串'@ *',其中*是带有'@ newcompany.com'的任何字符集。我希望保留@之前的所有内容。 谢谢大家。
df_users['EMAIL'] = df_users['EMAIL'].str.replace('@', '@newcompany.com')
答案 0 :(得分:2)
您可以使用向量化str
方法拆分'@'
字符,然后使用新域名加入左侧:
In [42]:
df = pd.DataFrame({'email':['asdsad@old.com', 'asdsa@google.com', 'hheherhe@apple.com']})
df
Out[42]:
email
0 asdsad@old.com
1 asdsa@google.com
2 hheherhe@apple.com
In [43]:
df['email'] = df.email.str.split('@').str[0] + '@newcompany.com'
df
Out[43]:
email
0 asdsad@newcompany.com
1 asdsa@newcompany.com
2 hheherhe@newcompany.com
另一种方法是调用vectorised replace
,它接受正则表达式作为字符串上的模式:
In [56]:
df['email'] = df['email'].str.replace(r'@.+', '@newcompany.com')
df
Out[56]:
email
0 asdsad@newcompany.com
1 asdsa@newcompany.com
2 hheherhe@newcompany.com
<强>计时强>
In [58]:
%timeit df['email'] = df['email'].str.replace(r'@.+', '@newcompany.com')
1000 loops, best of 3: 632 µs per loop
In [60]:
%timeit df['email'] = df.email.str.split('@').str[0] + '@newcompany.com'
1000 loops, best of 3: 1.66 ms per loop
In [63]:
%timeit df['email'] = df['email'].replace(r'@.+', '@newcompany.com', regex=True)
1000 loops, best of 3: 738 µs per loop
在这里,我们可以看到str.replace
正则表达式版本比split
方法快近3倍,有趣的是Series.replace方法似乎与{{{{3}}方法做同样的事情1}}慢了。
答案 1 :(得分:1)
这听起来像是regex的工作!熊猫&#39; replace
将允许您使用正则表达式,您只需将其设置为true即可。你大部分时间都在那里,以下内容适合你。
df_users['EMAIL'].replace('@.*$', '@newcompany.com', inplace=True, regex=True)