用浮点索引插值一系列

时间:2013-11-16 17:19:01

标签: python pandas

我有以下数据框

   density  A2     B2
0       20   1  0.525
1       30   1  0.577
2       40   1  0.789
3       50   1  1.000
4       75   1  1.000
5      100   1  1.000

我正在尝试使用value插入列result_column的值index_column

让我们说value = 35, result_column = 'B2', index_column= 'density'

result = pd.Series(df[result_column])
try:
   result.index = df[index_column].astype(float)
except ValueError:
   evaluation_error(_("cannot perform interpolation on non numeric index"))

然后我追加一个索引为value

的新行
result = result.append(pd.Series(None,index=[value]))

和插值

result = result.interpolate(method="values")
result = result.loc[value][:1,]

失败
TypeError: "Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'"

这里的错误信息并不神秘。我正在使用pandas 0.12,我知道浮点索引存在问题。

调试一下我还可以看到索引创建为object而不是float,这会阻止插值。

(Pdb) result.index
Index([20.0, 30.0, 40.0, 50.0, 75.0, 100.0, 0.8], dtype=object)

我还没有设法强制系列索引浮动或能够在原始数据帧上执行插值。

我也试过

(Pdb) pd.Series(df[result_column], index=df[index_column])
(Pdb) pd.Series(df[result_column], index=df[index_column].astype(float))
(Pdb) pd.Series(df[result_column], index=pd.Series(df[index_column],dtype=float))

全部回来了

density
20        NaN
30        NaN
40        NaN
50        NaN
75        NaN
100       NaN
Name: A2, dtype: float64

我的问题是 - 执行插值的最佳原因是什么?

修改 跟进@TomAugspurger回答

(Pdb) l
249         pdb.set_trace()
250         result = df.set_index(index_column)[result_column]
251         result = result.reindex(result.index + pd.Index([value]))
252         
253  ->     result = result.interpolate(method='values')[value][:1,]
254         return result
(Pdb) result
20     0.630
30     0.692
35       NaN
40     0.947
50     1.200
75     1.200
100    1.200
Name: B2, dtype: float64
(Pdb) result.index
Index([20, 30, 35, 40, 50, 75, 100], dtype=object)
(Pdb) result.interpolate(method='values')
*** TypeError: Cannot cast array data from dtype('O') to dtype('float64') according to the rule 'safe'

我不明白 - 在Ipython中运行此代码时,我得到了预期的结果,但在运行时它继续使用此TypeError失败。

EDIT2 索引转向了对象,因为value的类型为Decimal。虽然我不确定为什么价值会影响指数......我只会进行转换。

1 个答案:

答案 0 :(得分:3)

这有用吗?

In [29]: df = df.set_index('density')

In [31]: df = df.reindex(df.index + pd.Index([35]))

In [32]: df
Out[32]: 
     A2     B2
20    1  0.525
30    1  0.577
35  NaN    NaN
40    1  0.789
50    1  1.000
75    1  1.000
100   1  1.000

In [33]: df.interpolate(method='values')
Out[33]: 
     A2     B2
20    1  0.525
30    1  0.577
35    1  0.683
40    1  0.789
50    1  1.000
75    1  1.000
100   1  1.000