train_df = pd.read_csv(train_file, header=0, skiprows=lambda i: i>0 and random.random() > 0.3)
我有这个,但意识到这是不可复制的。有没有一种方法可以从大型csv中随机选择行的子集,而无需以可重复的方式知道该文件的长度?似乎read_csv会支持。
我知道有一个功能
df.sample(random_state=123)
但是,由于文件大小,在读取csv时,Id需要此功能。
我肯定知道行数超过900k,所以我可以做...
np.random.seed(42)
skip = np.random.randint(0,900000,200000)
train_df = pd.read_csv(train_file, header=0, skiprows=skip)
但这并不能使每一行都有相等的机会进入样本,因此并不理想。 read_csv可以扫描csv并返回文件的长度吗?
答案 0 :(得分:1)
这里需要两次读取文件-首先是length,然后是read_csv
,因为read_csv
无法返回文件的长度:
np.random.seed(1245)
def file_len(fname):
with open(fname) as f:
for i, l in enumerate(f):
pass
return i + 1
train_file = 'file.csv'
num = file_len(train_file)
print (num)
skip = np.random.randint(0,num,200000)
#more dynamic - 20% of length
#skip = np.random.randint(0,num,int(num * 0.2))
train_df = pd.read_csv(train_file, header=0, skiprows=skip)
print (train_df)
答案 1 :(得分:1)
您可以尝试
import pandas as pd
import numpy as np
np.random.seed(4)
pd.read_csv(file, header=0,
skiprows=lambda i: i>0 and np.random.choice(5))
答案 2 :(得分:1)
np.random.seed(42)
p = 0.3 #% of rows to read in
train_df = pd.read_csv(train_file, header=0, skiprows=lambda x: (x>0) & (np.random.random() > p))