如何在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
相关产品推荐
相关产品推荐

