如何在学生成绩数据集很大的情况下获得N名得分最高者的姓名?

2024-06-08 04:51:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.txt文件,其中包含一个大数据集(超过9000万个条目),格式如下:

^{tb1}$

在文本文件中,分数和名称由2个空格分隔,每行有一个分数名称条目

此.txt文件不能一次加载到内存中

如何在python中获得前N名最高分者?
注意:N的值可能非常大

示例:
所以当N=2时

输出应为:
雷克斯
马克斯

python中有没有一种方法可以直接获得前N个记分器,而不必再次以另一种文件格式保存整个数据

哪种方式更有效?
1.)逐个读取分数条目,并保存/更新最大的N个分数条目?
2.)将所有数据移动到数据帧并使用NLAGEST


Tags: 文件数据方法内存txt名称示例格式
1条回答
网友
1楼 · 发布于 2024-06-08 04:51:07

要将文本文件读入pandas^{},答案是here
然后,您可以尝试以下操作: 您可以尝试使用pandas^{}。例如,您可以执行以下操作:

largest = df.nlargest(n,'score')['Student Name']

您还可以将score列转换为Numpy数组并使用^{}

import numpy as np
largest = df.iloc[np.argsort(-df['score'])[:n]]['Student Name']

此外,您可以尝试对数据帧进行排序,并按如下方式获取前n行:

largest = df.sort_values('score', ascending=False).iloc[:n]['Student Name']

下面是一个具有1亿条记录和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

相关问题 更多 >

    热门问题