4

私はパンダのデータフレームを持っています。別の 2 つの列を含む条件に基づいて、列から単一の値を取得したいと考えています。column1 と column2 で最大の距離である column3 の値を探しています。

動作する簡単な例を作成します。

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'

ここで、列のタイプに問題がある可能性があることがわかりましたが、Depth はタイプHpernumpy.float64はタイプfloatVper はタイプでfloatあるため、問題にどのように適用できるかを理解しています。

同じコードがある場合には機能するが別の場合には機能しないことを理解しているため、この時点から何をすべきかわかりません。問題を特定することはできません。

4

1 に答える 1

12

と にいくつかの文字列がありDenFrame.HperますDenFrame.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)
于 2013-01-22T01:50:48.653 に答える