我有一列包含电话号码。它们通常采用
(555) 123-4567
格式,但有时它们的格式不同或者不是正确的数字。我正在尝试将此字段转换为仅包含数字,删除所有非数字字符(如果有 10 个数字)。
如何应用一个函数,如果该字段中有 10 个数字,则仅提取数字?
我尝试使用:
df['PHONE'] = df['PHONE'].str.extract('(\d+)', expand=False)
但这只是提取第一组数字(区号)。如何提取所有数字并且仅在字段中正好有 10 个数字时才运行此提取?
我的预期输出是
5551234567
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))
想通了。我创建了一个应用于我的电话号码字段的函数
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)
df['PHONE'] = df['PHONE'].str.replace(r'\)|\(| |-', '', regex=True)
将用正则表达式替换 ()、空格和 -。只需将所有其他不需要的角色添加到您的集合中即可。如果不需要的部分是正则表达式语法字符,则使用 \
将其转义由于国家/地区代码的原因,电话号码可能会超过 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版本。文档应该清楚地说明如何解析、验证和重新格式化电话号码。