#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"])