我正在逐行加载一个csv文件,因为其中有大约8亿行,而且我需要分析其中许多文件,因此并行加载至关重要,因此也需要逐行加载,以免炸毁记忆。
我得到了一个答案,该答案是如何使用collections.Counter()
计算整个数据集中存在唯一ID的条目数。 (请参阅Counting csv column occurrences on the fly in Python)
但是有没有一种方法可以为另一列中的每个唯一ID计算读入行的另一列中的运行数据总数呢?
例如假设您的csv文件中的数据只有两列,因此如下所示:
[1 1]
[1 1]
[2 2]
[3 2]
[2 2]
[1 2]
第二列包含唯一的ID,第一列中要为其保留连续的值。因此您的输出应如下所示:
{'1': 2, '2': 8}
在第二列中ID为'1'的地方,总数由第一列中的1 + 1给出。 对于第一列中的ID“ 2”,总数由2 + 3 + 2 + 1给出。
鉴于我正在使用的csv庞大,该如何快速做到这一点?
import csv
features = {}
with open(filename) as f:
reader = csv.reader(f,delimiter=',')
for row in reader:
ID = row[1]
if SrcDevice not in features.keys():
features[ID] = {}
features[ID]['Some_feature'] = 0
features[SrcDevice]['Some_feature'] += float(row[0])
但是,如此多的行需要很长时间。这里的想法是,我还将创建一个类似的字典,但是出现的次数很多,以便可以将特征字典除以该字典以计算特征的均值。 (似乎没有必要,但请记住,这些文件太大,它们会逐行读取)。
在链接的问题中已经提到使用sqlite3,但是我想看看是否可以首先在Python中有效地完成此操作。提前致谢!