Я создаю 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.






Я думаю, вы можете использовать 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())
Как насчет использования filter в каждом столбце? Я обновил свой ответ, пожалуйста, проверьте новый код.
Могут быть
NaNзначения. Однако не должно быть столбца, состоящего только из значенийNaN. То есть я не могу просто поставитьallow_nan=False.