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

按条件拆分DataFrame时出现行丢失,原因何在?

问题原因分析

丢失的8000行是Category为"food"的行,核心问题出在你的过滤逻辑错误,以及可能存在的代码笔误:

1. 过滤表达式filter_cr的逻辑缺陷

你的filter_cr = (df["Category"].isNull()) & (df["Category"] != "food")本身逻辑矛盾:

  • 当Category为NULL时,df["Category"] != "food"的结果是NULL(Spark中NULL与任何值比较都返回NULL),而Spark的过滤条件只会保留结果为True的行,NULL会被直接过滤,所以这部分行本不该出现在df_food中,但你的df_food计数为120000,说明你可能把逻辑运算符写错了(比如误将|写成&)。
  • 当Category为"food"时,filter_cr的结果是False,所以不会被df_food包含。

2. df_non_food的实际过滤逻辑不符合预期

按照你给出的代码,df_non_food = df.filter(~filter_cr),此时~filter_cr等价于(df["Category"].notNull()) | (df["Category"] == "food"),理论上应该包含所有"food"和"non-food"的行(总计22000+8000=30000行),但你实际得到的df_non_food只有22000行,说明你大概率没有使用~filter_cr作为过滤条件,而是误写成了df["Category"] == "non-food",直接漏掉了所有"food"行,导致这8000行完全丢失。

正确的拆分方式

如果要将数据拆分为「food组」和「非food+NULL组」,正确的逻辑应该是:

# 匹配food行
df_food = df.filter(df["Category"] == "food")
# 匹配非food或NULL的行
df_non_food_null = df.filter((df["Category"].isNull()) | (df["Category"] != "food"))

如果要拆分为三类单独处理:

df_food = df.filter(df["Category"] == "food")
df_non_food = df.filter(df["Category"] == "non-food")
df_null = df.filter(df["Category"].isNull())

这样拆分后所有行都会被正确分配,不会出现丢失情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:50:53