按条件拆分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
相关产品推荐
相关产品推荐

