У меня есть pandas dataframe df с несколькими столбцами. Один из столбцов - Col1, который содержит значения с плавающей запятой или NaN:
df
+----+------+-----+
| No | Col1 | ... |
+----+------+-----+
| 12 | 10 | ... |
| 23 | NaN | ... |
| 34 | 5 | ... |
| 45 | NaN | ... |
| 54 | 22 | ... |
+----+------+-----+
Я запускаю функцию через Col1, исключая пропущенные значения (NaN), например:
StandardScaler().fit_transform(df.loc[pd.notnull(df[Col1]), [Col1]])
Представьте, что результатом является такой numpy.ndarray:
+-----+
| Ref |
+-----+
| 2 |
| 5 |
| 1 |
+-----+
Обратите внимание, что этот массив не имеет той же длины, что и исходный столбец Col1.
Мне нужно решение добавить массив Ref в качестве столбца в df. Для каждой строки, где Col1 - это NaN, новый столбец Ref также получает NaN.
Желаемый результат будет выглядеть так:
+----+------+-----+-----+
| No | Col1 | ... | Ref |
+----+------+-----+-----+
| 12 | 10 | ... | 2 |
| 23 | NaN | ... | NaN |
| 34 | 5 | ... | 5 |
| 45 | NaN | ... | NaN |
| 54 | 22 | ... | 1 |
+----+------+-----+-----+






Я думаю, вы можете назначить новый столбец, отфильтрованный по той же логической маске:
from sklearn.preprocessing import StandardScaler
mask = df['Col1'].notnull()
df.loc[mask, 'Ref'] = StandardScaler().fit_transform(df.loc[mask, ['Col1']])
print (df)
No Col1 Ref
0 12 10.0 -0.327089
1 23 NaN NaN
2 34 5.0 -1.027992
3 45 NaN NaN
4 54 22.0 1.355081
Деталь:
print (StandardScaler().fit_transform(df.loc[mask, ['Col1']]))
[[-0.32708852]
[-1.02799249]
[ 1.35508101]]