Бинаризация непрерывной функции с помощью NaNs Python

#pandas #binary #nan

#pandas #двоичный #nan

Вопрос:

У меня есть фрейм данных pandas из 4000 строк и 35 объектов, в которых некоторые из непрерывных объектов содержат пропущенные значения (NAN). Например, один из них (с 46 пропущенными значениями) имеет очень искаженное влево распределение, и я хотел бы бинаризовать его, выбрав пороговое значение 1,5, ниже которого я хотел бы установить его как класс 0 и выше или равным 1,5 как класс 1. Например: X_original = [0.01,2.80,-1.74,1.34,1.55], X_bin = [0, 1, 0, 0, 1].

Я пытался сделать : dataframe["bin"] = (dataframe["original"] > 1.5).astype(int) . Однако я заметил, что отсутствующие значения (NaNs) исчезли, и они кодируются в классе 0.

Как я мог решить эту проблему?

Комментарии:

1. Что вы хотите делать с пропущенными значениями?

2. после того, как мне нужно будет сопоставить их с остальными функциями

3. как их приписать?

4. используя либо импьютер KNN, либо LSTM

Ответ №1:

Насколько мне известно, есть способ сохранить недостающие значения после сравнения, но вы можете сделать следующее:

 import pandas as pd
import numpy as np

X_original = pd.Series([0.01,2.80,-1.74, np.nan,1.55])

X_bin = X_original > 1.5
X_bin[X_original.isna()] = np.NaN

print(X_bin)
 

Вывод

 0    0.0
1    1.0
2    0.0
3    NaN
4    1.0
dtype: float64
 

Чтобы сохранить столбец как целое число (а также с возможностью обнуления), выполните:

 X_bin = X_bin.astype(pd.Int8Dtype())
print(X_bin)
 

Вывод

 0       0
1       1
2       0
3    <NA>
4       1
dtype: Int8
 

Ответ №2:

Лучший способ справиться с этой проблемой, который я нашел, — использовать понимание списка:

 dataframe["Bin"] = [0 if el<1.5 else 1 if el >= 1.5 else np.NaN for el in dataframe["Original"]]
 

Затем я преобразую числа с плавающей запятой в объекты, кроме np.NaN

 dataframe["Bin"] = dataframe["Bin"].replace([0.0,1.0],["0","1"])