Spark转Pandas后select_dtypes误选数据类型问题咨询
问题解答
1. 为什么int字段被识别为double?
核心原因是Spark与Pandas的类型兼容规则,结合Parquet的存储特性:
- Spark的
IntegerType列如果包含null值,转换为Pandas DataFrame时会自动转为float64(即你看到的double类型)——因为Pandas原生int类型不支持存储空值,只能用浮点类型兼容。 - 此外,Parquet文件的类型定义可能存在隐式转换,比如部分写入场景下int类型会被存储为可空数值类型,Spark读取后转Pandas时就会触发类型升级。
你可以用pandasdf.isnull().any()检查这些int列是否存在空值,这大概率是触发转换的直接原因。
2. 如何修改查询排除int字段?
你之前的include='double', exclude='int'无效,是因为Pandas里没有严格的double类型,所谓的double实际对应float64;而原本的int列此时已经被转为float64,exclude='int'根本匹配不到目标列。推荐以下几种解决方法:
方法一:基于Spark原始类型提前筛选
直接在Spark阶段就筛选出double类型的列,再转Pandas,从源头避免类型混淆:
# 提取Spark DataFrame中类型为double的列名 double_cols = [col for col, dtype in df.dtypes if dtype == 'double'] # 筛选后转Pandas filtered_pandasdf = df.select(double_cols).toPandas()
方法二:精确匹配Pandas的浮点类型
如果已经转成了Pandas DataFrame,直接用float64作为筛选条件,同时结合原始列名过滤:
# 先拿到Spark中确认的double列名 double_cols = [col for col, dtype in df.dtypes if dtype == 'double'] # 直接按列名筛选Pandas DataFrame filtered_pandasdf = pandasdf[double_cols]
方法三:判断浮点列是否为整数类型(针对空值导致的转换)
如果原本的int列只是因空值转为float,但数值本身都是整数,可以通过判断列值是否全为整数来过滤:
# 筛选出真正的浮点列(排除那些数值全为整数的float64列) real_double_cols = [] for col in pandasdf.select_dtypes(include='float64').columns: # 剔除空值后检查所有值是否为整数 if not pandasdf[col].dropna().apply(lambda x: x.is_integer()).all(): real_double_cols.append(col) filtered_pandasdf = pandasdf[real_double_cols]
内容的提问来源于stack exchange,提问作者Ananya
相关产品推荐
相关产品推荐

