减少 python for 循环的时间复杂度

reduce the time complexity for python for loop

我有 python 个包含以下列的数据框:

Index([u'Academic Period', u'Academic Period Desc', u'Student ID',
       u'Subject', u'Course Number', u'Course Reference Number',
       u'Course Identification', u'Schedule Type', u'Instructor's ID',
       u'Highest Degree', u'Highest Degree Code',
       u'Instructor Position Employee Group'],
      dtype='object')

我现在尝试按行循环,检查并比较两列值:

for i in df['Student ID']:
    if df['Course Reference Number'] >= 50000:
        if df['Highest Degree Code'] <= 7:
            print df["Instructor's ID"]
    else:
        if df['Highest Degree Code'] <= 6:
            print df["Instructor's ID"]

我的文件中有 910,000 多行,循环遍历的时间太长了。

我可以将时间复杂度从 O(n) 降低到更低(使用任何可能的算法)吗?

谢谢!

假设你有这个数据框:

import pandas as pd
df = pd.DataFrame({'Course Reference Number':[10000, 10000, 20000, 30000,
                   50000, 70000, 80000, 80000, 90000],
                   "Highest Degree Code":[7,6,1,8,7,6,8,6,9],
                   "Instructor's ID":range(9)})

df 是:

   Course Reference Number  Highest Degree Code  Instructor's ID
0                    10000                    7                0
1                    10000                    6                1
2                    20000                    1                2
3                    30000                    8                3
4                    50000                    7                4
5                    70000                    6                5
6                    80000                    8                6
7                    80000                    6                7
8                    90000                    9                8

您可以使用布尔运算:

m_1 = df['Course Reference Number'] >= 50000
m_2 = df['Highest Degree Code'] <= 7
m_3 = df['Highest Degree Code'] <= 6
print df["Instructor's ID"][(m_1 & m_2) | ((~m_1) & m_3)].values

您将获得:

[1 2 4 5 7]

如果你想要结果行:

print df[(m_1 & m_2) | ((~m_1) & m_3)]

你会看到:

   Course Reference Number  Highest Degree Code  Instructor's ID
1                    10000                    6                1
2                    20000                    1                2
4                    50000                    7                4
5                    70000                    6                5
7                    80000                    6                7

我不知道 python,但是,您可以重新排序条件以 可能 更有效率。

for i in df['Student ID']:
    if df['Highest Degree Code'] <= 7:
        if df['Course Reference Number'] >= 500000:
            print df["Instructor's ID"]
        elif df['Highest Degree Code'] <= 6:
            print df["Instructor's ID"]

我重新排序是因为,如果 Highest Degree Code > 7,你不想打印,不管 Course Reference Number. 的值对我来说似乎更合乎逻辑的是先检查确定是否要打印的内容,然后再树出更多条件。

但是,只有在 更多 次出现时,此方法才会更有效,其中:

Highest Degree Code is > 7

比有:

Highest Degree Code <=7 AND Course Reference Number < 50000