如果两个符号出现在字符串中,则删除两个符号之间的字符串

时间:2018-02-06 15:23:13

标签: string pandas split

我想删除'+'和'@'符号之间的子字符串以及'+,如果存在'+'。

d = {'1' : 'dsjlskdgj+fdfsd@test.com', '2' : 'qwioept@test.com', '3' : 'dccnvmxcv+fas@test.com', '4':'dqlt@test.com'}

test_frame = pd.Series(d)

test_frame
Out[6]: 
1    dsjlskdgj+fdfsd@test.com
2            qwioept@test.com
3      dccnvmxcv+fas@test.com
4               dqlt@test.com
dtype: object

所以,结果应该是:

s = {'1' : 'dsjlskdgj@test.com', '2' : 'qwioept@test.com', '3' : 'dccnvmxcv@test.com', '4':'dqlt@test.com'}

test_frame_result = pd.Series(s)

test_frame_result
Out[10]: 
1    dsjlskdgj@test.com
2      qwioept@test.com
3    dccnvmxcv@test.com
4         dqlt@test.com
dtype: object

我用split进行了尝试,但是由于只有一些行包含+,所以它失败了。

是否有一个优雅的解决方案,没有遍历所有行(在原始数据集中有很多)。

谢谢!

2 个答案:

答案 0 :(得分:1)

这还够吗?

import pandas as pd
d = {'1' : 'dsjlskdgj+fdfsd@test.com', 
         '2' : 'qwioept@test.com', 
         '3' : 'dccnvmxcv+fas@test.com', 
         '4':'dqlt@test.com'}

test_frame = pd.Series(d)
test_frame
print test_frame

found = test_frame[test_frame.str.contains(r'\+')]
test_frame[found.index] = found.str.replace(r'\+[^@]*', "")
print test_frame

输出:

(前)

1    dsjlskdgj+fdfsd@test.com
2            qwioept@test.com
3      dccnvmxcv+fas@test.com
4               dqlt@test.com
dtype: object

(之后)

1    dsjlskdgj@test.com
2      qwioept@test.com
3    dccnvmxcv@test.com
4         dqlt@test.com
dtype: object

答案 1 :(得分:0)

找到了解决方案 - 可能不是最优雅的:

import pandas as pd

test_frame = pd.DataFrame({'email':['dsjlskdgj+fdfsd@test.com','qwioept@test.com','dccnvmxcv+fas@test.com','dqlt@test.com']})

test_frame
Out[22]: 
                      email
0  dsjlskdgj+fdfsd@test.com
1          qwioept@test.com
2    dccnvmxcv+fas@test.com
3             dqlt@test.com

test_frame.loc[test_frame.email.str.contains('\+'),'email'] = test_frame[test_frame.email.str.contains('\+')].email.str.partition('+')[0] + '@' + test_frame[test_frame.email.str.contains('\+')].email.str.partition('+')[2].str.partition('@')[2]

test_frame
Out[24]: 
                email
0  dsjlskdgj@test.com
1    qwioept@test.com
2  dccnvmxcv@test.com
3       dqlt@test.com