【问题标题】:How to speed up pandas drop() method?如何加快熊猫 drop() 方法?
【发布时间】:2019-12-15 00:01:26
【问题描述】:

我有一个大的 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 来获得相同的输出吗?

我对 pandas 或 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

这是我的代码所做的,但速度很慢。

【问题讨论】:

  • 您能否提供示例输入数据和预期输出
  • for 循环会消耗时间,如果你发布你的数据框,有人会想出一个 vecorized 的解决方案!
  • 200000 非常小。如果您能提供一些示例数据,S/O pandas 天才会在几分钟内拿出解决方案。

标签: python excel pandas numpy


【解决方案1】:

在我看来,这里的主要引导项不是丢弃,而是针对大量值重复的自定义函数。

创建所有有效数字的列表,然后按boolean indexingSeries.isin 过滤:

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

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

编辑:

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

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

【讨论】:

  • 谢谢它的工作也谢谢你告诉我布尔索引和 Series.isin 我从来不知道它可以这样编码。
  • @JohnZapanta - 欢迎您!还添加了另一个解决方案。
  • 如果它不会给你带来麻烦,你能解释一下代码是如何工作的吗?原因是“它工作”,但我想知道如何。
  • @JohnZapanta - 你认为第一个还是第二个解决方案?
  • @JohnZapanta - 当然。首先由TeleNum 使用循环,并且对于每个值进行过滤,可能bset 解释是herethis。第二个使用Series.apply - 用于所有列值的运行函数,返回另一个由True和False填充的系列,因此可能通过boolean indexing进行过滤
猜你喜欢
  • 1970-01-01
  • 2020-02-22
  • 2021-10-17
  • 2020-04-08
  • 1970-01-01
  • 2018-11-17
  • 2021-09-17
  • 1970-01-01
  • 2018-04-28
相关资源
最近更新 更多