通过正则表达式将pandas列替换为其自身的子集

时间:2015-05-07 03:08:35

标签: python regex pandas

我有以下格式的数据流:

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

2 个答案:

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