如何在熊猫的fillna中使用math.sin()

时间:2018-09-21 19:28:25

标签: python pandas fillna

我尝试在fillna中使用math.sin()函数,但失败了:

---------------------------------------------------------------------------
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}}

1 个答案:

答案 0 :(得分:2)

您正在使用需要标量输入的函数。 math.sin期望一个单一值,即:

>>> math.sin(1)
0.8414709848078965

您需要一个向量化函数来查找Series中每个值的正弦值,在这种情况下,该值由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