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 值都是浮点数(numpy.float64),您可以applymap(因为列都被转换为浮点数,所以在这里工作):

df = df.applymap(float)

我不知道你是如何得到NumericType对象的,我假设除以 2 vs 2.0 就是由此而来。

于 2013-02-06T12:42:22.173 回答