Python:快速子集和循环数据帧

3 python loops numpy python-2.7 pandas

我有以下太慢的最小代码。对于我需要的 1000 行,大约需要 2 分钟。我需要它运行得更快。

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(0,1000,size=(1000, 4)), columns=list('ABCD'))
start_algorithm = time.time()
myunique = df['D'].unique()
for i in myunique:
    itemp = df[df['D'] == i]
    for j in myunique:
        jtemp = df[df['D'] == j]
Run Code Online (Sandbox Code Playgroud)

我知道 numpy 可以让它运行得更快,但请记住,我想保留原始数据帧(或 numpy 中的数组)的一部分,用于列 'D' 的特定值。我怎样才能提高它的性能?

unu*_*tbu 5

避免多次计算子 DataFrame df[df['D'] == i]。原始代码计算这个len(myunique)**2时间。相反,您可以为每个计算一次i(即len(myunique)总次数),存储结果,然后稍后将它们配对。例如,

    groups = [grp for di, grp in df.groupby('D')]
    for itemp, jtemp in IT.product(groups, repeat=2):
        pass
Run Code Online (Sandbox Code Playgroud)
import pandas as pd
import itertools as IT
df = pd.DataFrame(np.random.randint(0,1000,size=(1000, 4)), columns=list('ABCD'))

def using_orig():
    myunique = df['D'].unique()
    for i in myunique:
        itemp = df[df['D'] == i]
        for j in myunique:
            jtemp = df[df['D'] == j]

def using_groupby():
    groups = [grp for di, grp in df.groupby('D')]
    for itemp, jtemp in IT.product(groups, repeat=2):
        pass
Run Code Online (Sandbox Code Playgroud)
In [28]: %timeit using_groupby()
10 loops, best of 3: 63.8 ms per loop
In [31]: %timeit using_orig()
1 loop, best of 3: 2min 22s per loop
Run Code Online (Sandbox Code Playgroud)

关于评论:

我可以很容易地用 a=1 替换 itemp 和 jtemp 或者打印“Hello”所以忽略它

上述地址答案如何计算itempjtemp更有效。如果itemp并且jtemp不是您实际计算的核心,那么我们需要更好地了解您真正想要计算的内容,以便建​​议(如果可能)一种更快计算的方法。