pandas中的字符串通配符替换函数

时间:2015-03-26 20:07:11

标签: python pandas

我确定这个问题很容易回答,但是我无法确定要使用的正确字符串。我基本上想要用新域替换数据框中的任何电子邮件地址。对于特定列,请替换子字符串'@ *',其中*是带有'@ newcompany.com'的任何字符集。我希望保留@之前的所有内容。 谢谢大家。

df_users['EMAIL'] = df_users['EMAIL'].str.replace('@', '@newcompany.com')

2 个答案:

答案 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)