如何高效从大型Pandas DataFrame采样?现有代码卡顿求助
解决DataFrame采样卡顿的优化方案
你的问题出在重复操作上:先通过sample生成采样后的DataFrame再提取索引,接着又用loc重新定位原DataFrame,这相当于对大表做了两次遍历/索引查找,自然会慢。
直接用下面两种更高效的方式:
方式一:直接使用sample的结果(最简便)
sample方法本身就会返回采样后的DataFrame,不需要额外用loc二次索引,代码简化为:
import numpy as np np.random.seed(42) X = X_it.sample(frac=0.1)
这样一步到位,省去了索引提取和二次查找的开销,速度会快很多。
方式二:生成随机整数索引用iloc(适合整数索引场景)
如果你的DataFrame用的是默认的连续整数索引(RangeIndex),可以直接用numpy生成随机索引,再通过iloc定位,iloc的整数定位比loc的标签定位效率更高:
import numpy as np np.random.seed(42) total_rows = X_it.shape[0] sample_size = int(total_rows * 0.1) sel_idx = np.random.choice(total_rows, size=sample_size, replace=False) X = X_it.iloc[sel_idx]
这里用np.random.choice直接生成要采样的行号,避免了sample方法生成临时DataFrame的额外开销,对于超大型表更友好。
另外补充一点:如果你的DataFrame索引不是连续整数,或者有重复标签,loc的查找会因为要匹配标签而变慢,这时候优先用方式一或者确保用整数索引配合iloc。
内容的提问来源于stack exchange,提问作者procrastinationmonkey
相关产品推荐
相关产品推荐

