熊猫通过采样来读取csv

时间:2019-03-02 23:40:52

标签: python pandas csv

我有一个很大的CSV文件,我只想从中获取1%的样本。是否有一个很好的方法将样本直接读取到熊猫数据框中,而不必读取整个文件,然后丢弃99%的数据?

2 个答案:

答案 0 :(得分:1)

假定行数足够大以使大号定律生效,并且您不需要精确地等于1%(非常接近),则可以执行以下操作: / p>

import csv
from random import random
import pandas
with open('data.csv', 'r') as fin:
    reader = csv.reader(fin)
    rows = [l for l in reader if random() >= 0.99]
    df = pandas.DataFrame(rows)

这将顺序扫描整个文件一次以获取行,但不会将整个文件保留在内存中。它将逐行遍历所有行,并且仅将大约1%的随机选择行保留在内存中。如果您不想将文件加载到内存中,又不想先扫描文件以计数行数,那么这可能是最好的。

如果您确实需要它恰好是行的1%,并且/或者也需要它用于较小的文件,那么您可以扫描该文件一次以计算文件{{1}中的行总数}。然后生成一组total_lines个随机行号,这些行号<=总#行。然后,您使用上面的方法,并在文件中的各行之间进行迭代时,只需检查当前所在的行号是否位于0.01 * total_lines中,如果保留则保留,否则将其抛弃:

set()

答案 1 :(得分:0)

使用带有复杂选择器的跳过行:

示例为 rows=1000 prob=.01 print len(pd.read_csv(filename, usecols=[0], skiprows=lambda x: x in random.sample(xrange(0,num_rows), int((1.0-prob)*num_rows )))) 还有其他方法可以通过分块读取然后跳过行来完成。 例如您可以使用chunksize=100 skiprows=99