You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:15:03