【问题标题】:unsupported operand in pandas dataframe operation熊猫数据框操作中不支持的操作数
【发布时间】:2013-01-05 04:18:30
【问题描述】:

我有熊猫数据框。我想根据涉及另外两列的条件从一列中获取单个值。我正在寻找 column3 中的值,它是 column1 和 2 中距离最大的值。

我构建了一个有效的简单示例:

d = pd.DataFrame({'c1':[.1,3,11.3],'c2':[3,6,.6],'c3':[8,.8,10.9]})
print'data d=\n%s\n' % d                                               
x = float(d.c3[abs(d.c1-d.c2)==max(abs(d.c1-d.c2))].values)
print 'the value of x= \n%s\n' % x

这个例子的输出和我预期的一样:

     c1   c2    c3
0   0.1  3.0   8.0
1   3.0  6.0   0.8
2  11.3  0.6  10.9

the value of x= 
10.9

我尝试将完全相同的逻辑应用于我原来的问题,即类中的大型数据框。代码是:

yInit = float(self.DenFrame.Depth[abs(self.DenFrame.Hper-self.DenFrame.Vper)==max(abs(self.DenFrame.Hper-self.DenFrame.Vper))].values)

但是这段代码会产生错误:

...
  File "C:\Python27\lib\site-packages\pandas-0.9.0-py2.7-win32.egg\pandas\core\series.py", line 73, in wrapper
return Series(na_op(self.values, other.values),
  File "C:\Python27\lib\site-packages\pandas-0.9.0-py2.7-win32.egg\pandas\core\series.py", line 59, in na_op
result[mask] = op(x[mask], y[mask])
TypeError: unsupported operand type(s) for -: 'str' and 'str'

我在here 中发现列的类型可能存在问题,但深度是numpy.float64 类型,Hper 是float 类型,Vper 是float 类型,所以我明白它如何适用于我的问题。

从这一点上我不知道该怎么做,因为我知道相同的代码在一种情况下有效,但在另一种情况下无效,我无法发现问题。

【问题讨论】:

  • 确认DenFrame.Hper.dtypeDenFrame.Vper.dtype是float64?
  • 当我使用:print self.DenFrame.Hper.dtype 时,输出为object。对于print type(self.DenFrame.Hper),输出是<class 'pandas.core.series.Series'>,里面的所有位置都是float(我有点迷失这种类型)
  • DenFrame.Vper.dtype 怎么样,DenFrame.Hper.map(type).unique() 的输出是什么(Vper 也是如此)。
  • 对于print self.DenFrame.Hper.map(type).unique(),输出为:[<type 'float'> <type 'str'>]DenFrame.Vper完全相同
  • 不幸的是,这意味着您在这些列中有一些字符串!

标签: python pandas


【解决方案1】:

您的DenFrame.HperDenFrame.Vper 中有一些字符串。

您可以通过检查dtype 或每个元素的类型来查看:

In [11]: df.Hper.dtype
Out[11]: dtype('object')

表示numpy数组可以包含各种类型,我们可以看看这些类型是什么:

In [12]: DenFrame.Hper.map(type).unique()
Out[12]: [<type 'float'> <type 'str'>]

您可以检查哪些条目是字符串:

DenFrame[DenFrame.Hper.map(type) == str]

也许只包括那些是浮动的是有意义的:

DenFrame_floats = DenFrame[(DenFrame.Hper.map(type) == float) & 
                           (DenFrame.Vper.map(type) == float)]

或者你可以(如果可能的话)将它们转换为浮点数:

DenFrame.Hper = DenFrame.Hper.apply(float)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多