给定大量学生分数,如何获得 N 个最高分的名字?
How to obtain the names of N highest scorers given a large dataset of student scores?
我有一个包含大型数据集(超过 9000 万个条目)的 .txt 文件,格式如下:
Score
Student Name
35
Lily
45
Rex
20
Cameron
45
Max
20
Jasmin
在文本文件中,乐谱和名称由 2 个空格分隔,每行一个乐谱名称条目
无法一次将此 .txt 文件加载到内存中。
如何获得python的前N个最高分?
注意:N的值可以很大
示例:
所以当N=2时,
输出应该是:
雷克斯
最大值
在python中有没有办法直接获取前N个得分手而不用另一种文件格式再次保存整个数据?
哪种方式效率更高?
1.) 一个一个读取分数条目和save/update最大的N个分数条目?
2.) 将所有数据移动到 pandas 数据帧并使用 nlargest ?
将文本文件读入 pandas DataFrame
the answer to that is here.
然后您可以尝试以下操作:
您可以尝试使用 pandas nlargest
。例如你可以这样做:
largest = df.nlargest(n,'score')['Student Name']
您还可以将 score
列转换为 Numpy 数组并使用 argsort
import numpy as np
largest = df.iloc[np.argsort(-df['score'])[:n]]['Student Name']
此外,您可以尝试对 DataFrame 进行排序并取前 n 行,如下所示:
largest = df.sort_values('score', ascending=False).iloc[:n]['Student Name']
这是具有 1 亿条记录的 DataFrame 和 n=1000000
的运行时间比较
df = pd.DataFrame(np.random.randint(0, 100, size=(100000000, 2)), columns=['score', 'Student Name'])
n = 1000000
start = time()
temp = df.nlargest(n, 'score')['Student Name']
print(time() - start)
start = time()
temp2 = df.iloc[np.argsort(-df['score'])[:n]]['Student Name']
print(time() - start)
start = time()
temp3 = df.sort_values('score', ascending=False).iloc[:n]['Student Name']
print(time() - start)
结果:
3.5889642238616943
13.237002849578857
19.69099760055542
所以最有效的方法是使用 nlargest
我有一个包含大型数据集(超过 9000 万个条目)的 .txt 文件,格式如下:
Score | Student Name |
---|---|
35 | Lily |
45 | Rex |
20 | Cameron |
45 | Max |
20 | Jasmin |
在文本文件中,乐谱和名称由 2 个空格分隔,每行一个乐谱名称条目
无法一次将此 .txt 文件加载到内存中。
如何获得python的前N个最高分?
注意:N的值可以很大
示例:
所以当N=2时,
输出应该是:
雷克斯
最大值
在python中有没有办法直接获取前N个得分手而不用另一种文件格式再次保存整个数据?
哪种方式效率更高?
1.) 一个一个读取分数条目和save/update最大的N个分数条目?
2.) 将所有数据移动到 pandas 数据帧并使用 nlargest ?
将文本文件读入 pandas DataFrame
the answer to that is here.
然后您可以尝试以下操作:
您可以尝试使用 pandas nlargest
。例如你可以这样做:
largest = df.nlargest(n,'score')['Student Name']
您还可以将 score
列转换为 Numpy 数组并使用 argsort
import numpy as np
largest = df.iloc[np.argsort(-df['score'])[:n]]['Student Name']
此外,您可以尝试对 DataFrame 进行排序并取前 n 行,如下所示:
largest = df.sort_values('score', ascending=False).iloc[:n]['Student Name']
这是具有 1 亿条记录的 DataFrame 和 n=1000000
df = pd.DataFrame(np.random.randint(0, 100, size=(100000000, 2)), columns=['score', 'Student Name'])
n = 1000000
start = time()
temp = df.nlargest(n, 'score')['Student Name']
print(time() - start)
start = time()
temp2 = df.iloc[np.argsort(-df['score'])[:n]]['Student Name']
print(time() - start)
start = time()
temp3 = df.sort_values('score', ascending=False).iloc[:n]['Student Name']
print(time() - start)
结果:
3.5889642238616943
13.237002849578857
19.69099760055542
所以最有效的方法是使用 nlargest