python - 理解 Pandas 数据框中的数学错误

标签 python pandas ipython

我正在尝试从其他列在 pandas 数据框中生成一个新列,但出现了一些我不理解的数学错误。这是问题的快照和一些简化的诊断...

我可以生成一个看起来不错的数据框:

import pandas
import math as m

data = {'loc':['1','2','3','4','5'],
        'lat':[61.3850,32.7990,34.9513,14.2417,33.7712],
        'lng':[-152.2683,-86.8073,-92.3809,-170.7197,-111.3877]}
frame = pandas.DataFrame(data)

frame

Out[15]:
lat lng loc
0    61.3850    -152.2683    1
1    32.7990     -86.8073    2
2    34.9513     -92.3809    3
3    14.2417    -170.7197    4
4    33.7712    -111.3877    5
5 rows × 3 columns

我可以做简单的数学运算(即度数到弧度):

In [32]:
m.pi*frame.lat/180.

Out[32]:
0    1.071370
1    0.572451
2    0.610015
3    0.248565
4    0.589419
Name: lat, dtype: float64

但我无法使用 python 数学库将度数转换为弧度:

 In [33]:
 m.radians(frame.lat)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-99a986252f80> in <module>()
----> 1 m.radians(frame.lat)

/Users/user/anaconda/lib/python2.7/site-packages/pandas/core/series.pyc in wrapper(self)
     72             return converter(self.iloc[0])
     73         raise TypeError(
---> 74             "cannot convert the series to {0}".format(str(converter)))
     75     return wrapper
     76 

TypeError: cannot convert the series to <type 'float'>

甚至不能将值转换为 float 以试图强制它工作:

In [34]:

float(frame.lat)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-34-3311aee92f31> in <module>()
----> 1 float(frame.lat)

/Users/user/anaconda/lib/python2.7/site-packages/pandas/core/series.pyc in wrapper(self)
     72             return converter(self.iloc[0])
     73         raise TypeError(
---> 74             "cannot convert the series to {0}".format(str(converter)))
     75     return wrapper
     76 

TypeError: cannot convert the series to <type 'float'>

我相信一定有一个简单的解释,非常感谢您帮助找到它。谢谢!

最佳答案

数学函数,例如 math.radians期望一个数值,如 float ,而不是一个序列,如 pandas.Series

相反,您可以使用 numpy.radians ,因为 numpy.radians 可以接受数组作为输入:

In [95]: np.radians(frame['lat'])
Out[95]: 
0    1.071370
1    0.572451
2    0.610015
3    0.248565
4    0.589419
Name: lat, dtype: float64

只有长度为 1 的 Series 可以转换为 float。所以虽然 这行得通,

In [103]: math.radians(pd.Series([1]))
Out[103]: 0.017453292519943295

一般不会:

In [104]: math.radians(pd.Series([1,2]))
TypeError: cannot convert the series to <type 'float'>

math.radians 正在对其参数调用 float。请注意,在 pd.Series([1,2]) 上调用 float 时会出现相同的错误:

In [105]: float(pd.Series([1,2]))
TypeError: cannot convert the series to <type 'float'>

关于python - 理解 Pandas 数据框中的数学错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23748842/

相关文章:

python - Bootstrap 'Buttons with Dropdowns'

Python 使用 re 模块解析导入的文本文件

python - 滚动字符串变量

python - 使用等距基数的列在 Pandas 中创建直方图,与范围不成比例

python - 运行IPython/Jupyter Notebook 会影响程序速度吗?

python - makemigrations 未检测到 Django 1.7 中扩展模型的更改

python - Pandas 的一列 float 结果是对象?

python - 在 Python 中合并数据框时出现重复的行

python - 从 iruby 或 ipython 笔记本运行 Ruby 或 Python 脚本?

python - Ipython 交互功能绘制多个图而不是编辑一个图