减少 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
我有 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