Идея вашего rle
правильная. На образце вектора x
,
with(rle(is.na(x)), max(lengths[values]) >= 5)
будет TRUE, если в строке 5 или более NA
s. Просто используйте your_data$value
для x
.
Чтобы объяснить, давайте возьмем некоторые данные образца
x = c(1,1,1,1,1,1,1,1, NA, 1,1, NA, NA, NA, NA, NA, 1)
Немного сломаем rle(is.na(x1))
, запустите (FULSE, после is.na
)
rle(is.na(x))
# Run Length Encoding
# lengths: int [1:5] 8 1 2 5 1
# values : logi [1:5] FALSE TRUE FALSE TRUE FALSE
Конечно, мы заботимся только о TRUE
s (NA
] s), поэтому мы подмножаем lengths
на values
, сохраняя длины, соответствующие значениям TRUE.
with(rle(is.na(x)), lengths[values])
# [1] 1 5
Тогда это так же просто, как смотреть на max
того, что остается , и посмотрите, превышает ли он ваш порог.
Вы можете использовать pyspark.sql.functions.format_string
, что позволяет применять формат в формате printf
для отображения результатов.
В этом случае вы можете использовать строку формата "%.2e"
для форматирования числа с плавающей запятой в экспоненциальной (научной) записи с двумя десятичными знаками.
Например:
from pyspark.sql.functions import col, format_string
df.select(*[format_string("%.2e", col(c).cast("float")).alias(c) for c in df.columns]).show()
#+--------+--------+
#| col1| col2|
#+--------+--------+
#|3.35e+04|4.59e+07|
#|4.48e+08|7.86e+06|
#+--------+--------+
Помните, что результирующий столбец является строкой (а не числом).