Skip to main content
 首页 » 编程设计

python之将 lambda 函数应用于 pandas 数据框之返回索引但不返回值

2025年05月04日21落叶无声

我正在运行一个清理一些电话号码(英国)的过程,并决定使用正则表达式/替换在 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