首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将大型CSV文件中的小随机样本读取到Python数据框中

将大型CSV文件中的小随机样本读取到Python数据框中
EN

Stack Overflow用户
提问于 2014-03-08 03:00:09
回答 9查看 66.4K关注 0票数 87

我要读取的CSV文件不能放入主内存。如何读取其中的几行(~10K)随机行,并对选定的数据帧进行一些简单的统计?

EN

回答 9

Stack Overflow用户

发布于 2014-03-08 03:29:09

假设CSV文件中没有标头:

代码语言:javascript
复制
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接受回调函数而不是列表,那会更好。

具有标头和未知文件长度:

代码语言:javascript
复制
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)
票数 93
EN

Stack Overflow用户

发布于 2016-03-19 02:05:44

这里有一个算法,它不需要事先计算文件中的行数,所以你只需要读取文件一次。

假设你想要m个样本。首先,算法保留前m个样本。当它看到概率为m/i的第i个样本(i > m)时,该算法使用该样本随机替换已经选择的样本。

通过这样做,对于任何i> m,我们总是有从第一个i个样本中随机选择的m个样本的子集。

请看下面的代码:

代码语言:javascript
复制
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
票数 11
EN

Stack Overflow用户

发布于 2015-01-10 22:50:46

下面的代码首先读取头,然后在其他行上随机抽样:

代码语言:javascript
复制
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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22258491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档