Как я могу использовать math.sin () в fillna в пандах - PullRequest
0 голосов
/ 21 сентября 2018

Я пытался использовать функцию 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 Ответ

0 голосов
/ 21 сентября 2018

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