如何在熊猫中优化/替换这两个嵌套的While循环

时间:2020-04-13 09:28:53

标签: python pandas while-loop

我是Python的新手,所以很高兴能做到这一点!我有一个包含1,700,000条记录和4列(e,n,o,p)+索引的数据框(df1),这是大量预处理和连接的结果。

当前此代码需要2个小时才能运行,并且显然相交在1.3m的n可能值和700000的e可能值之间减少了一个因子 一方面是1000000条记录,另一方面是170万条记录。

我无法进行其他预处理来生成例如e,n或它们的交集的子集。

result = ""
cp = True
ep = 0
while ep < 700000: #700000
    np = 0
    while np < 1300000: #1300000
        df2 = df1[(df1["e"] >= ep) & (df1["e"] < ep + 1000) & (df1["n"] >= np) & (df1["n"] < np + 1000)]
        if not df2.dropna().empty:
            df3 = df2[df2.o== df2.o.min()]
            df4 = df3.drop(columns = ["e", "n", "o"])
            z = df4.to_string(header = cp)
            result = result + "\n" + z
            cp = False
        np += 1000
    np = 0
    ep += 1000

样本数据:

       p     e         n         o
15646  str0  134746.0  466842.0  421.283752
15643  str1  134229.0  466923.0  502.364410
15588  str2  134023.0  467007.0  685.986880
15645  str3  133142.0  467081.0  551.112511
15649  str4  132632.0  467511.0  132.457540
32508  str5  133995.0  607803.0  580.374017
32502  str6  133750.0  607900.0  471.699057
32509  str7  133462.0  607987.0  488.480296
32532  str8  134761.0  608314.0  320.494930
32526  str9  130148.0  608801.0  463.146845

@Błotosmętek提出的使用df_aux的建议(但有while循环,请参见下面的讨论)得到了很大的改进。

1 个答案:

答案 0 :(得分:1)

在代码的第5行中,您显然是从df1中选择记录的子集,其中e的值在当前epep+1000的范围内-但您每次都在内部循环中执行此操作。将这部分移到外部循环应该会大大加快速度。另一个优化不是从df3删除列,而是仅选择列'p'。我还冒昧地将for循环替换为while循环,以提高可读性。

result = ''
for ep in range(0, 700000, 1000):
    df_aux = df2 = df1[(df1["e"] >= ep) & (df1["e"] < ep + 1000)]
    for np in range(0, 1300000, 1000):
        df2 = df_aux[(df_aux["n"] >= np) & (df_aux["n"] < np + 1000)]
        if not df2.dropna().empty:
            df3 = df2[df2.offset == df2.offset.min()]
            z = df3["p"].to_string()
            result += "\n" + z

请检查结果是否与原始代码相同。