如何在Pandas中读取CSV时随机采样DataFrame而不读取全量数据?
可行!给你两种实用方法
不用读完整CSV就能随机采样,确实可以做到,给你两个靠谱的实现方式:
方法一:精确指定采样行数(需要先统计总行数)
这种方法能精准拿到你要的sample_size行,步骤是先数出CSV的总行数,再随机生成要跳过的行号,只保留目标行数:
import pandas as pd import random sample_size = 10 input_data = "你的文件路径.csv" # 先统计CSV总行数(减去表头行) with open(input_data, 'r', encoding='utf-8') as f: total_rows = sum(1 for _ in f) - 1 # 减1是去掉表头那一行 # 生成要跳过的行号:从第1行(表头下第一行)到最后一行里,随机选(total_rows - sample_size)行跳过 skip_rows = random.sample(range(1, total_rows + 1), total_rows - sample_size) # 读取CSV,跳过指定行,直接得到随机采样的DataFrame df = pd.read_csv(input_data, skiprows=skip_rows)
注意:如果你的CSV里有字段包含换行符(比如文本字段里的换行),用这种方式数行数会不准,这时候可以用pandas分块读取来统计行数,虽然慢一点,但更准确:
total_rows = 0 for chunk in pd.read_csv(input_data, chunksize=1000): total_rows += len(chunk)
方法二:概率抽样(无需统计总行数)
如果不想先数总行数,或者文件超大数行太慢,可以用概率抽样的方式,每一行按概率决定是否保留,最终样本量会接近你设置的sample_size:
import pandas as pd import random sample_size = 10 input_data = "你的文件路径.csv" # 预估一下总行数(不用特别精准,越大误差越小) estimated_total = 10000 # 计算每行被保留的概率 sample_prob = sample_size / estimated_total # 用lambda函数判断每行是否跳过:表头不跳过,其他行按概率随机跳过 df = pd.read_csv( input_data, skiprows=lambda i: i > 0 and random.random() > sample_prob )
这种方法的好处是不用提前数行数,缺点是最终的样本行数不是严格等于sample_size,但文件越大,实际样本量越接近目标值。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

