我确信这个问题有一个简单的答案,但我无法确定要使用的正确字符串。我基本上想用新域替换数据框中的任何电子邮件地址。对于特定列,将子字符串“@*”替换为“@newcompany.com”,其中 * 是任何字符集。我想保留 @ 之前的任何内容。 谢谢大家。
df_users['EMAIL'] = df_users['EMAIL'].str.replace('@', '@newcompany.com')
最佳答案
您可以使用向量化的 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
另一种方法是调用向量化的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似乎与 str.replace
执行相同操作的方法速度较慢。
关于python - 替换函数中 pandas 中的字符串通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29287847/