Как я могу использовать math.sin () в fillna в пандах

1

Я попытался использовать функцию 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'>
  • 1
    что не удалось? сообщение об ошибке?
  • 5
    math.sin не принимает итеративный код, он ожидает одно значение. Вам нужно использовать np.sin , который векторизован
Показать ещё 1 комментарий
Теги:
pandas
fillna

1 ответ

2

Вы используете функцию, которая ожидает скалярный ввод. 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню