我有以下数据框
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
。虽然我不确定为什么价值会影响指数......我只会进行转换。
答案 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