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