1

私はdfを持っています:

df:
               a      b       c
date
2012-01-01   0.50    1.2    0.70 
2012-01-01   0.45    1.2    0.65
2012-01-01   0.65    1.2    0.63
2012-01-01   0.75    1.2    0.29
2012-01-01   -0.25   1.2    -0.68

計算したい: a/b - c

走る:

new = df['a']/df['b'] - df['c']

これは新しいものを返します:

date
2012-01-01   -0.2833 
2012-01-01   -0.2750
2012-01-01   -0.0883
2012-01-01   0.3350
2012-01-01   0.4717

最初のエラー: 私が行けば:

new.ix[0][0]
TypeError: 'NumericType' object is unsubscriptable

なのでシリーズ物だと思います。

だから私はそれを次のように変更します:

new = pd.DataFrame(new)
type(new.ix[0][0])

<type 'NumericType'>

これは奇妙な部分です:

new.ix[0][0]
-0.2833
new.ix[0][0]/2
-0.141650
new.ix[0][0]/2.0
0

数値型はどうなっていますか?フロートに変更するにはどうすればよいですか?ここでのベストプラクティスは何ですか?

ありがとうございました。

4

1 に答える 1

1

動作の違いの理由newは、Series と DataFrame の場合です。

最初newに作成するのはSeriesです:

In [11]: s = new = df['a'] / df['b'] - df['c']

In [12]: type(s)
Out[12]: pandas.core.series.Series

これは の位置0に値があります-0.2833:

In [13]: s.ix[0]
Out[13]: -0.28333333333333327

__getitem__(フロートではできません。たとえば2.0[0]、同様のエラーが発生します。)

ただし、それをDataFrameに強制すると:

In [14]: df_new = new = pd.DataFrame(s)

In [15]: df_new
Out[15]: 
          0
0 -0.283333
1 -0.275000
2 -0.088333
3  0.335000
4  0.471667

In [16]: type(df_new)
Out[16]: pandas.core.frame.DataFrame

今回は 0 番目のインデックスはシリーズ (行) です。

In [17]: df_new.ix[0]
Out[17]: 
0   -0.283333
Name: 0

In [18]: df_new.ix[0][0]
Out[18]: -0.28333333333333327

アップデート:

すべての DataFrames 値が float ( numpy.float64) であることを確認するには、次のことができます(すべての列が float に変換されているapplymapため、ここで機能します)。

df = df.applymap(float)

どうやってNumericTypeオブジェクトを取得したのかわかりませんが、2 対 2.0 による除算はこれから派生すると思います。

于 2013-02-06T12:42:22.173 に答える