Я попытался использовать функцию math.sin() в fillna, но я потерпел неудачу:
data['Sensor #1'].fillna(math.sin(data["Sample #"] * parameter), inplace = True)
Есть ли способ исправить это?
Здесь появляется сообщение об ошибке:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-145-9199336c2860> in <module>()
11
12
---> 13 data['Sensor #1'].fillna(math.sin(data["Sample #"] * parameter), inplace = True)
14 data['Sensor #2'].fillna(lambda r: r["Sample #"]**-parameter, inplace = True)
15 # drop the row that has empty value(s) because we want to find anomalies
/anaconda3/lib/python3.6/site-packages/pandas/core/series.py in wrapper(self)
115 return converter(self.iloc[0])
116 raise TypeError("cannot convert the series to "
--> 117 "{0}".format(str(converter)))
118
119 return wrapper
TypeError: cannot convert the series to <class 'float'>
Вы используете функцию, которая ожидает скалярный ввод. 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
этого используйте 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
math.sin
не принимает итеративный код, он ожидает одно значение. Вам нужно использоватьnp.sin
, который векторизован