Кадр данных гипотезы Python предполагает, что столбец не состоит исключительно из значений NaN

Я создаю pd.DataFrame, используя библиотеку hypothesis, вот так:

import datetime
from hypothesis import strategies as st
from hypothesis.extra.pandas import columns as cols
from hypothesis.extra.pandas import data_frames, indexes

data_frames(
    columns=cols(
        ["sec1", "sec2", "sec3"], elements=st.floats(allow_infinity=False)
    ),
    index=indexes(elements=st.dates(
        min_value=datetime.date(2023,10,31), 
        max_value=datetime.date(2024,5,31))
    ),
).example()

                     sec1 sec2          sec3
2024-01-05  -3.333333e-01  NaN           NaN
2024-05-20  -9.007199e+15  NaN -2.000010e+00
2024-02-28  -1.175494e-38  NaN  1.500000e+00
2024-01-24  -1.100000e+00  NaN  1.100000e+00
2023-11-19  -1.175494e-38  NaN -2.000010e+00
2024-05-28  -1.000000e-05  NaN  2.541486e+16
2024-01-31 -1.797693e+308  NaN           NaN
2024-05-03  4.940656e-324  NaN -6.647158e+16

Мне нужно убедиться, что отдельный столбец не состоит исключительно из значений NaN.

Кроме того, я хочу избежать создания пустого pd.DataFrame.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы можете использовать filter в сгенерированном примере DataFrame, чтобы исключить наборы данных с плохой выборкой.

Используйте что-то вроде этого:

data = data_frames(...)
data = data.filter(lambda tt: tt.isna().sum(axis=0).max() < tt.shape[0])

Или, если вы хотите применить фильтр только к набору столбцов:

data = data_frames(...)

# or which is the same
col_names = ['sec2','sec3']
data = data.filter(lambda tt: tt[col_names].isna().sum(axis=0).max() < tt.shape[0])

Я обнаружил один нюанс: вам нужно применить фильтр ко всем столбцам вместе в одной функции .filter. В противном случае вы все равно можете увидеть столбцы со всеми NaN. Например, эти инструкции не позволят создать правильный набор данных:

# Doesn't work - Still may give columns with all Nones!
data = data_frames(...)
for col in colnames:
    data = data.filter(lambda tt: tt[col].isna().sum() < tt.shape[0])

Результат

Итак, окончательный код:

import datetime
from hypothesis import strategies as st
from hypothesis.extra.pandas import columns as cols
from hypothesis.extra.pandas import data_frames, indexes


aa = data_frames(
    columns=cols(
        ["sec1", "sec2", "sec3"], 
        elements=st.floats(allow_infinity=False)
    ),
    index=indexes(elements=st.dates(
        min_value=datetime.date(2023,10,31), 
        max_value=datetime.date(2024,5,31)),
        min_size = 1 # generate at least 1 row, prevents generating empty dataframe
    ),
)


# or which is the same
aa = aa.filter(lambda tt: tt.isna().sum(axis=0).max() < tt.shape[0])

print(aa.example())

Могут быть NaN значения. Однако не должно быть столбца, состоящего только из значений NaN. То есть я не могу просто поставить allow_nan=False.

Andi 04.06.2024 17:26

Как насчет использования filter в каждом столбце? Я обновил свой ответ, пожалуйста, проверьте новый код.

Johnny Cheesecutter 04.06.2024 18:38

Другие вопросы по теме