ser = pd.Series([
1, 1, np.nan, 0, 0, 1, np.nan, 1, 1, np.nan, 0, 0, np.nan])
Используйте value_counts
с normalize=True
, чтобы получить список вероятностей, соответствующих вашим значениям.Затем генерируйте значения случайным образом в соответствии с заданным распределением вероятностей и используйте fillna
для заполнения NaN.
p = ser.value_counts(normalize=True).sort_index().tolist()
u = np.sort(ser.dropna().unique())
ser = ser.fillna(pd.Series(np.random.choice(u, len(ser), p=p)))
Это решение должно работать для любого числа числовых / категориальных значений, а не только для 0и 1с.Если данные являются строковым типом, используйте pd.factorize
и преобразуйте в числовое значение.
Подробности
Сначала вычислите распределение вероятностей:
ser.value_counts(normalize=True).sort_index()
0.0 0.444444
1.0 0.555556
dtype: float64
Получите список уникальных значений, отсортированных таким же образом:
np.sort(ser.dropna().unique())
array([0., 1.])
Наконец, сгенерируйте случайные значения с заданным распределением вероятности.
pd.Series(np.random.choice(u, len(ser), p=p))
0 0.0
1 0.0
2 1.0
3 0.0
4 0.0
5 0.0
6 1.0
7 1.0
8 0.0
9 0.0
10 1.0
11 0.0
12 1.0
dtype: float64