我有以下格式的数据流:
from StringIO import StringIO
data ="""\
ANI/IP
sip:5554447777@10.94.2.15
sip:10.66.7.34@6665554444
sip:3337775555@10.94.2.11
"""
import pandas as pd
df = pd.read_table(StringIO(data),sep='\s+',dtype='str')
我想要做的是只用上面字符串的电话号码部分替换列内容。我尝试了thread这样的建议:
df['ANI/IP'] = df['ANI/IP'].str.replace(r'\d{10}', '').astype('str')
print(df)
然而,这导致:
.....print(df)
ANI/IP
0 sip:@10.94.2.15
1 sip:@10.66.7.34
2 sip:@10.94.2.11
我需要电话号码,所以我该如何实现? :
ANI/IP
0 5554447777
1 6665554444
2 3337775555
答案 0 :(得分:4)
正则表达式\d{10}
搜索精确到10个字符的数字子字符串。
df['ANI/IP'] = df['ANI/IP'].str.replace(r'\d{10}', '').astype('str')
删除数字!
注意:你不应该使用astype str(它不是必需的,并且pandas中没有str dtype)。
您想要extract这些电话号码:
In [11]: df["ANI/IP"].str.extract(r'(\d{10})') # before overwriting!
Out[11]:
0 5554447777
1 6665554444
2 3337775555
Name: ANI/IP, dtype: object
将此设置为另一列,您就离开了:
In [12]: df["phone_number"] = df["ANI/IP"].str.extract(r'(\d{10})')
答案 1 :(得分:1)
您可以使用pandas.core.strings.StringMethods.extract
提取
In [10]: df['ANI/IP'].str.extract("(\d{10})")
Out[10]:
0 5554447777
1 6665554444
2 3337775555
Name: ANI/IP, dtype: object