Неожиданный результат наименьшего значения (исходные данные содержат нули)Python

Программы на Python
Ответить
Anonymous
 Неожиданный результат наименьшего значения (исходные данные содержат нули)

Сообщение Anonymous »

Вдохновленный этим ответом, я хочу найти минимум по строкам между несколькими столбцами дат и вернуть имя столбца.
Я получаю неожиданные результаты, когда строка содержит значения NULL , который, как мне казалось, меньше всего исключен, особенно строки 2–5 в этом игрушечном примере:
import datetime as dt

from pyspark.sql import Row
from pyspark.sql.types import StructField, StructType, DateType

schema = StructType([
StructField("date1", DateType(), True),
StructField("date2", DateType(), True),
StructField("date3", DateType(), True)
])
row1 = Row(dt.date(2024, 1, 1), dt.date(2024, 1, 2), dt.date(2024, 1, 3))
row2 = Row(None, None, dt.date(2024, 1, 3))
row3 = Row(None, dt.date(2024, 1, 1), dt.date(2024, 1, 2))
row4 = Row(None, None, None)
row5 = Row(dt.date(2024, 1, 1), None, None)

df = spark.createDataFrame([row1, row2, row3, row4, row5], schema)

def row_min(*cols):
cols_ = [F.struct(F.col(c).alias("value"), F.lit(c).alias("col")) for c in cols]
return F.least(*cols_)

df.withColumn("output", row_min('date1', 'date2', 'date3').col).show()

возвращает
+----------+----------+----------+------+
| date1| date2| date3|output|
+----------+----------+----------+------+
|2024-01-01|2024-01-02|2024-01-03| date1|
| NULL| NULL|2024-01-03| date1|
| NULL|2024-01-01|2024-01-02| date1|
| NULL| NULL| NULL| date1|
|2024-01-01| NULL| NULL| date2|
+----------+----------+----------+------+

но желаемый результат:
+----------+----------+----------+------+
| date1| date2| date3|output|
+----------+----------+----------+------+
|2024-01-01|2024-01-02|2024-01-03| date1|
| NULL| NULL|2024-01-03| date3|
| NULL|2024-01-01|2024-01-02| date2|
| NULL| NULL| NULL| NULL|
|2024-01-01| NULL| NULL| date1|
+----------+----------+----------+------+


Подробнее здесь: https://stackoverflow.com/questions/793 ... udes-nulls
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»