【发布时间】:2019-01-31 10:07:35
【问题描述】:
假设您有一个数据框,其中包含各种类型的列(字符串、双精度...)和一个特殊值“miss”,它表示字符串类型列中的“缺失值”。
from pyspark.sql import SparkSession
import pandas as pd
spark = SparkSession.builder.getOrCreate()
pdf = pd.DataFrame([
[1, 'miss'],
[2, 'x'],
[None, 'y']
], columns=['intcol', 'strcol'])
df = spark.createDataFrame(data=pdf)
我正在尝试使用如下过滤来计算每列的非缺失值的数量:
col = df['strcol']
df.filter(col.isNotNull() & (col != 'miss')).show()
适用于字符串列:
+------+------+
|intcol|strcol|
+------+------+
| 2.0| x|
| NaN| y|
+------+------+
但是,对于数字列,它会过滤掉所有行:
col = df['intcol']
df.filter(col.isNotNull() & (col != 'miss')).show()
+------+------+
|intcol|strcol|
+------+------+
+------+------+
这似乎是因为数字列与字符串值的跨类型比较导致全空值:
df.select(df['intcol'] != 'miss').show()
+---------------------+
|(NOT (intcol = miss))|
+---------------------+
| null|
| null|
| null|
+---------------------+
我觉得有点意外(例如,1 != '' 是 True,在“普通”Python 中不是 null)
我的问题其实是几个问题:
- 为什么交叉类型比较会产生空值?
- 以“预期方式”测试不同类型的相等/不相等的最佳方法是什么?或者(就我而言)我是否需要包含根据列类型进行切换的单独逻辑?
- 似乎
df.filter(~df['intcol'].isin(['miss']))可以完成这项工作,但我想知道这是否效率较低?
【问题讨论】:
标签: python apache-spark pyspark apache-spark-sql