如何加速pandas drop()方法?

2024-10-01 07:21:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的excel文件要清理大约200000行。因此,如果条件满足,我会使用pandas删除不需要的行,但运行起来需要一些时间。你知道吗

我当前的代码如下所示

def cleanNumbers(number):  # checks number if it is a valid number
    vaild = True
    try:
        num = pn.parse('+' + str(number), None)
        if not pn.is_valid_number(num):
            vaild = False
    except:
        vaild = False
    return vaild

for UncleanNum in tqdm(TeleNum):
    valid = cleanNumbers(UncleanNum)  # calling cleanNumbers function
    if valid is False:
        df = df.drop(df[df.telephone == UncleanNum].index)  
        # dropping row if number is not a valid number

这行代码大约需要30分钟才能完成。有没有一种更有效的方法来和熊猫划船?如果不是,我可以使用numpy来获得相同的输出吗?你知道吗

我不是那么喜欢大熊猫或者小矮人,所以如果你有什么建议可以分享的话,那会很有帮助的。你知道吗

编辑:

我使用phonenumbers lib检查电话号码是否有效。如果它不是一个有效的电话号码,我会删除该号码所在的行。你知道吗

示例数据

address     name    surname     telephone
Street St.  Bill    Billinson   7398673456897<--let say this is wrong
Street St.  Nick    Nick        324523452345
Street St.  Sam     Sammy       234523452345
Street St.  Bob     Bob         32452345234534<--and this too
Street St.  John    Greg        234523452345

输出

address     name    surname     telephone
Street St.  Nick    Nick        324523452345
Street St.  Sam     Sammy       234523452345
Street St.  John    Greg        234523452345

这就是我的代码所做的,但是它很慢。你知道吗


Tags: 代码falsestreetnumberdfifisnick
1条回答
网友
1楼 · 发布于 2024-10-01 07:21:13

在我看来,这里的主bootleneck不是drop,而是为大量值重复的自定义函数。你知道吗

创建所有有效数字的列表,然后使用^{}^{}筛选:

v = [UncleanNum for UncleanNum in tqdm(TeleNum) if cleanNumbers(UncleanNum)]

df = df[df.telephone.isin(v)]

编辑:

经过一些测试,解决方案应该简化,因为函数返回布尔值:

df1 = df[df['telephone'].apply(cleanNumbers)]

相关问题 更多 >