繁体   English   中英

降低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

我不知道蟒蛇,但是,你可以重新排列你的条件语句潜在的更有效率。

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.的值如何,您都不想打印Course Reference Number. 对我来说,检查一些决定你是否要先打印然后树到更多条件的东西似乎更合乎逻辑。

但是,只有在出现更多情况时,此方法才会更有效:

Highest Degree Code is > 7

比有:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM