Вы используете функцию, которая ожидает скалярный ввод.math.sin
ожидает одно значение, то есть:
>>> math.sin(1)
0.8414709848078965
Вам необходима векторизованная функция для поиска синуса каждого значения в Серии, которая в этом случае предоставляется библиотекой numpy
:
>>> s = pd.Series([1,2,3])
>>> np.sin(s)
0 0.841471
1 0.909297
2 0.141120
dtype: float64
Если у вас не установлен numpy
, у вас есть два варианта:
- Выполнить
pip install numpy
- Используйте
pd.np.sin
вместо
Остальная часть вашего кода выглядит нормально, вот рабочий пример:
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6], 'c': [np.nan, 0.84, np.nan]})
a b c
0 1 4 NaN
1 2 5 0.84
2 3 6 NaN
df.assign(c=df.c.fillna(np.sin(df.a)*df.b))
a b c
0 1 4 3.365884
1 2 5 0.840000
2 3 6 0.846720