【问题标题】:DataFrame.drop leads to ufunc loop error with numpy.sinDataFrame.drop 导致 numpy.sin 的 ufunc 循环错误
【发布时间】:2021-10-28 22:00:45
【问题描述】:

简介

我的代码应该从 .xlsx 文件中导入数据并以此为基础进行计算。问题在于每列的单位保存在工作表的第二行,并作为数据列的第一个条目导入。结果是这样的:

import pandas as pd
import numpy as np

data = pd.DataFrame(data = {'alpha' : ['[°]', 180, 180, 180]})

data['sin'] = np.sin(data['alpha'])

问题

因为第一个单元格是str类型,所以列变成object类型。我想我可以通过在两行之间添加以下代码来重新排列数据框来解决这个问题:

data = data.drop([0]).reset_index(drop = True)
data.astype({'alpha' : 'float64'})

数据框现在看起来像我想要的那样,我想它应该可以作为意图工作,但是我得到了一个 AttributeError 和一个 TypeError:

AttributeError: 'float' object has no attribute 'sin'TypeError: ufunc 循环不支持 float 类型的参数 0,它没有可调用的 sin 方法

TypeError: ufunc 循环不支持 float 类型的参数 0,它没有可调用的 sin 方法

任何关于我为什么会收到这些错误以及如何解决它们的见解将不胜感激!

【问题讨论】:

  • data['alpha'] = pd.to_numeric(data['alpha'], errors='coerce').
  • “关于我为什么会出现这些错误的任何见解...” 请参阅stackoverflow.com/questions/47208473/…(将numpy.log10 替换为numpy.sin);那里的解决方案或@QuangHoang 的评论和答案提供了避免错误的方法。
  • @WarrenWeckesser 非常感谢,这真的很有帮助!很好地解释了这个问题!

标签: python pandas dataframe numpy


【解决方案1】:

你可以像这样使用 Pandas 的转换功能:

data = pd.DataFrame(data = {'alpha' : ['[°]', 180, 180, 180]})

data['alpha'] = pd.to_numeric(data['alpha'], errors='coerce')

# is your alpha degrees or radians?
data['sin'] = np.sin(np.deg2rad(data['alpha']))

输出:

   alpha           sin
0    NaN           NaN
1  180.0  1.224647e-16
2  180.0  1.224647e-16
3  180.0  1.224647e-16

【讨论】:

  • 非常感谢,效果很好!我确实得到了 alpha 度数,但在我的实际代码中我将它转换为 rads,我只是忘记将转换添加到我的最小示例中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 2013-08-03
  • 1970-01-01
相关资源
最近更新 更多