Я конвертирую часть фрейма данных pandas в массив numpy, и я хочу заполнить его значения средним значением столбцов, аналогично тому, как я бы сделал следующее в pandas:

df.fillna(df.mean(), inplace = True)

Единственный способ сделать это до сих пор - перебирать столбцы. Есть другой способ?

Благодарю вас!

2
Olli 18 Сен 2021 в 08:06

2 ответа

Лучший ответ

Вы можете использовать np.take:

Настройте MRE

df = pd.DataFrame({'A': [1, np.nan, 2, 6], 'B': [5, np.nan, 8, 2]})

m = df.to_numpy()
print(m)

# Output
array([[ 1.,  5.],
       [nan, nan],
       [ 2.,  8.],
       [ 6.,  2.]])
mean = np.nanmean(m, axis=0)
idx = np.where(np.isnan(m))
m[idx] = np.take(mean, idx[1])
print(m)

# Output
array([[1., 5.],
       [3., 5.],
       [2., 8.],
       [6., 2.]])
2
Corralien 18 Сен 2021 в 05:23

Вы можете использовать np.where, как показано ниже:

df = pd.DataFrame({'A': [2, 1, np.nan, 6], 'B': [4, np.nan, 8, np.nan]})

a = df.to_numpy()
print(a)
# [[ 2.  4.]
#  [ 1. nan]
#  [nan  8.]
#  [ 6. nan]]

a = np.where(np.isnan(a), np.nanmean(a, axis=0), a) 
print(a)   

Выход:

[[2. 4.]
 [1. 6.]
 [3. 8.]
 [6. 6.]]
1
user1740577 18 Сен 2021 в 06:10