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

如何在PySpark中精准移除DataFrame中指定数量的采样行?

解决方案

你遇到的问题根源是subtract方法(尤其是PySpark中)会基于行的完整值匹配做批量删除,而非仅删除采样选中的特定行。可以通过以下方法实现需求:

方法1:Pandas场景(最简单)

直接通过采样结果的索引删除对应行即可:

# 5%采样
sdf = nsdf.sample(frac=0.05, random_state=42)
# 删除采样行,得到剩余95%数据
nsdf = nsdf.drop(sdf.index)

如果你的DataFrame存在重复索引,可以新增临时唯一行号再过滤:

# 新增临时唯一行号
nsdf["tmp_row_id"] = range(len(nsdf))
sdf = nsdf.sample(frac=0.05, random_state=42)
# 过滤非采样行后删除临时列
nsdf = nsdf[~nsdf["tmp_row_id"].isin(sdf["tmp_row_id"])].drop(columns="tmp_row_id")

方法2:PySpark场景

通过窗口函数给同值行加分组内序号,仅删除对应序号的行:

from pyspark.sql import functions as F
from pyspark.sql.window import Window

# 给原数据同值行加分组内序号
w = Window.partitionBy("col1").orderBy(F.rand())
nsdf_rn = nsdf.withColumn("rn", F.row_number().over(w))

# 给采样数据同值行加分组内序号
sdf_rn = sdf.withColumn("rn", F.row_number().over(w))

# 左反连接得到未被采样的行
nsdf = nsdf_rn.join(sdf_rn, on=["col1", "rn"], how="left_anti").drop("rn")

内容的提问来源于stack exchange,提问作者Aaron Krueger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:03