我正在运行一个清理一些电话号码(英国)的过程,并决定使用正则表达式/替换在 Pandas DataFrame 上运行 lambda 函数以删除我不想包含的字符(非数字,允许一个 +)
代码如下:(phone_test只是一个测试样例的DataFrame,两列,一个索引和值)
def clean_phone_number(tel_no):
for row in test_data:
row = re.sub('[^?0-9+]+', '', row)
return(row)
phone_test_result = phone_test['TEL_NUMBER'].apply(lambda x: clean_phone_number(x))
我遇到的问题是结果 (phone_test_result) 只返回 phone_test 数据帧的索引,而不是新格式化的电话号码。我已经绞尽脑汁几个小时了,但我确信这是一个简单的问题。
起初我以为这只是返回线的定位(它应该在 for 下,对吗?)但是当我这样做时我只得到一个电话号码的输出,在循环的长度内重复(这甚至不在 phone_test 数据框中!)
请暂停。 谢谢。
在回复之后,这就是我最终得到的:
使用正则表达式清理电话号码,只取前 13 个字符
- 用 +44 替换前导零
- 删除所有长度小于 13 个字符的内容。
它并不完美;
- 有一些电话号码的合法数字较少
- 意味着我删除了所有的分机号码
def clean_phone_number(tel_no):
clean_tel = re.sub('[^?0-9+]+', '', tel_no)[:13]
if clean_tel[:1] == '0':
clean_tel = '+44'+clean_tel[1:]
if len(clean_tel) < 13:
clean_tel = ''
return(clean_tel)
请您参考如下方法:
pd.Series.apply 将函数应用到系列中的每个值。注意 lambda 是不必要的。
import re
phone_test = pd.DataFrame({'TEL_NUMBER': ['+44-020841396', '+44-07721-051-851']})
def clean_phone_number(tel_no):
return re.sub('[^?0-9+]+', '', tel_no)
phone_test_result = phone_test['TEL_NUMBER'].apply(clean_phone_number)
# 0 +44020841396
# 1 +4407721051851
# Name: TEL_NUMBER, dtype: object
pd.DataFrame.apply,相比之下,将函数应用于数据框中的每个行:
def clean_phone_number(row):
return re.sub('[^?0-9+]+', '', row['TEL_NUMBER'])
phone_test_result = phone_test.apply(clean_phone_number, axis=1)
# 0 +44020841396
# 1 +4407721051851
# Name: TEL_NUMBER, dtype: object
