Pandas 提取电话号码(如果格式正确)

问题描述 投票:0回答:4

我有一列包含电话号码。它们通常采用

(555) 123-4567
格式,但有时它们的格式不同或者不是正确的数字。我正在尝试将此字段转换为仅包含数字,删除所有非数字字符(如果有 10 个数字)。

如何应用一个函数,如果该字段中有 10 个数字,则仅提取数字?

我尝试使用:

df['PHONE'] = df['PHONE'].str.extract('(\d+)', expand=False)

但这只是提取第一组数字(区号)。如何提取所有数字并且仅在字段中正好有 10 个数字时才运行此提取?

我的预期输出是

5551234567

python pandas dataframe text-extraction
4个回答
2
投票

最强大的可能是使用

str.replace
\D
正则表达式删除除数字之外的所有内容(=除数字之外的所有内容):

df['PHONE'] = df['PHONE'].str.replace(r'\D+', '', regex=True)

示例(为清楚起见,输出为 PHONE2):

            PHONE      PHONE2
0  (555) 123-4567  5551234567

如果您只想替换恰好有 10 位数字的行(并保持其他不变):

s = df['PHONE'].str.replace(r'\D+', '', regex=True)

df.loc[s.str.len().eq(10), 'PHONE2'] = s

如果只想保留只有 10 位数字的行(并将其他行替换为 NaN):

s = df['PHONE'].str.replace(r'\D+', '', regex=True)

df['PHONE'] = s.where(s.str.len().eq(10))

2
投票

想通了。我创建了一个应用于我的电话号码字段的函数

def extractNums(number):
    new_number = list(filter(str.isnumeric, number))
    if len(new_number) == 10:
        return "".join(new_number)
    else:
        return number

df['PHONE'] = df['PHONE'].apply(extractNums)

2
投票
df['PHONE'] = df['PHONE'].str.replace(r'\)|\(| |-', '', regex=True)

将用正则表达式替换 ()、空格和 -。只需将所有其他不需要的角色添加到您的集合中即可。如果不需要的部分是正则表达式语法字符,则使用 \

将其转义

0
投票

由于国家/地区代码的原因,电话号码可能会超过 10 位数字。 (在美国,最常见的是 1-800-555-5555 号码,因为它们带有北美 +1 国家/地区代码。)

我会过滤掉所有非数字字符(正则表达式

\D
)并删除无效的电话号码。 最长的符合 ITU 标准的电话号码 为 15 位数字。 (德国显然有一些数字超过了这个数字。)最短的国家/地区代码是 8。

s = pd.read_csv(io.StringIO('''pn
+1 123 456 7890
+44 123 456 7890
+1 (123) 456-7890
11234567890
441234567890
456456465654654465
123'''))
s['pn'].str.replace(r'\D', '', regex=True).mask(
    lambda s: s.str.len().gt(15) | s.str.len().lt(8), np.nan)

产量

0     11234567890
1    441234567890
2     11234567890
3     11234567890
4    441234567890
5             NaN
6             NaN
Name: pn, dtype: object

为了更好地验证,因为电话号码很复杂,您可能需要考虑

phonenumbers
,它移植了Google
libphonenumber
的Java版本。文档应该清楚地说明如何解析、验证和重新格式化电话号码。

© www.soinside.com 2019 - 2024. All rights reserved.