通过正则表达式将熊猫列替换为自身的一个子集

Posted

技术标签:

【中文标题】通过正则表达式将熊猫列替换为自身的一个子集【英文标题】:Replacing pandas column with a subset of itself through regex 【发布时间】:2015-07-17 10:42:58 【问题描述】:

我有以下格式的数据流:

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'\d10', '').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

【问题讨论】:

【参考方案1】:

正则表达式 \d10 搜索精确为 10 个字符长的数字子串。

df['ANI/IP'] = df['ANI/IP'].str.replace(r'\d10', '').astype('str')

这会删除数字!注意:你不应该做 astype str (它不是必需的,并且在 pandas 中没有 str dtype)。

你想extract这些电话号码:

In [11]: df["ANI/IP"].str.extract(r'(\d10)')  # 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'(\d10)')

【讨论】:

这和往常一样快 =) 谢谢@Andy Hayden。我的 Python 基础显然很薄弱!从 SAS/R 切换到 Python 已经一个月了! 我更喜欢打字70s style【参考方案2】:

你可以使用pandas.core.strings.StringMethods.extract来提取

In [10]: df['ANI/IP'].str.extract("(\d10)")
Out[10]:
0    5554447777
1    6665554444
2    3337775555
Name: ANI/IP, dtype: object

【讨论】:

以上是关于通过正则表达式将熊猫列替换为自身的一个子集的主要内容,如果未能解决你的问题,请参考以下文章

带有熊猫列的正则表达式

根据相同字符的不同位置将正则表达式应用于熊猫列

正则表达式说明

熊猫使用正则表达式选择列并按值除

如何使用选择性正则表达式在熊猫系列中执行替换?

正则表达式如何替换并修改自身的部分内容?