Предположим, у вас есть фрейм данных со столбцами различных типов (string, double ...) и специальным значением "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 != ''
Истина, но не ноль в "нормальном" Python)
Мой вопрос на самом деле состоит из нескольких вопросов:
- почему сравнение перекрестных типов приводит к нулям?
- каков наилучший способ проверки на равенство / неравенство между различными типами"ожидаемым образом"?Или (в моем случае) мне нужно включить отдельную логику, которая переключается в зависимости от типа столбца?
- Кажется, что
df.filter(~df['intcol'].isin(['miss']))
справляется, но мне интересно, если это менее эффективно?