通过正则表达式将熊猫列替换为自身的一个子集
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
【讨论】:
以上是关于通过正则表达式将熊猫列替换为自身的一个子集的主要内容,如果未能解决你的问题,请参考以下文章