我要读取的CSV文件不能放入主内存。如何读取其中的几行(~10K)随机行,并对选定的数据帧进行一些简单的统计?
发布于 2014-03-08 03:29:09
假设CSV文件中没有标头:
import pandas
import random
n = 1000000 #number of records in file
s = 10000 #desired sample size
filename = "data.txt"
skip = sorted(random.sample(range(n),n-s))
df = pandas.read_csv(filename, skiprows=skip)
如果read_csv有一个keeprows,或者如果skiprows接受回调函数而不是列表,那会更好。
具有标头和未知文件长度:
import pandas
import random
filename = "data.txt"
n = sum(1 for line in open(filename)) - 1 #number of records in file (excludes header)
s = 10000 #desired sample size
skip = sorted(random.sample(range(1,n+1),n-s)) #the 0-indexed header will not be included in the skip list
df = pandas.read_csv(filename, skiprows=skip)
发布于 2016-03-19 02:05:44
这里有一个算法,它不需要事先计算文件中的行数,所以你只需要读取文件一次。
假设你想要m个样本。首先,算法保留前m个样本。当它看到概率为m/i的第i个样本(i > m)时,该算法使用该样本随机替换已经选择的样本。
通过这样做,对于任何i> m,我们总是有从第一个i个样本中随机选择的m个样本的子集。
请看下面的代码:
import random
n_samples = 10
samples = []
for i, line in enumerate(f):
if i < n_samples:
samples.append(line)
elif random.random() < n_samples * 1. / (i+1):
samples[random.randint(0, n_samples-1)] = line
发布于 2015-01-10 22:50:46
下面的代码首先读取头,然后在其他行上随机抽样:
import pandas as pd
import numpy as np
filename = 'hugedatafile.csv'
nlinesfile = 10000000
nlinesrandomsample = 10000
lines2skip = np.random.choice(np.arange(1,nlinesfile+1), (nlinesfile-nlinesrandomsample), replace=False)
df = pd.read_csv(filename, skiprows=lines2skip)
https://stackoverflow.com/questions/22258491
复制相似问题