我有一个包含大量数据集(超过9000万条目)的.txt文件,格式如下:
分数 | 学生姓名 |
---|---|
35 | Lily |
45 | Rex |
20 | Cameron |
45 | Max |
20 | Jasmin |
在文本文件中,分数和姓名之间由两个空格分隔,每行有一个分数-姓名条目
此 .txt 文件无法一次性加载到内存中。
如何在 Python 中获取前 N 名最高分者?
注意:N 的值可能非常大
例如:
当 N=2 时,
输出应为:
Rex
Max
有没有一种方法可以直接在 Python 中获取前 N 名分数者,而无需将整个数据再次保存为另一种文件格式?
哪种方法更有效?
1.) 逐一读取分数条目并保存/更新最大的 N 个分数条目?
2.) 将所有数据移到 pandas 数据框并使用 nlargest?
回答:
要将文本文件读取到 pandas DataFrame
中,答案在这里:这里。
然后您可以尝试以下方法:您可以尝试使用 pandas nlargest
。例如,您可以这样做:
largest = df.nlargest(n,'score')['Student Name']
您还可以将score
列转换为 Numpy 数组并使用 argsort
import numpy as nplargest = 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.588964223861694313.23700284957885719.69099760055542
因此,最有效的方法是使用nlargest