我想删除'+'和'@'符号之间的子字符串以及'+,如果存在'+'。
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进行了尝试,但是由于只有一些行包含+,所以它失败了。
是否有一个优雅的解决方案,没有遍历所有行(在原始数据集中有很多)。
谢谢!
答案 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