我有以下数据框
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
我正在尝试使用index_column插值result_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"))
然后我用索引值附加新行
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,我知道float索引存在问题.
调试一下,我还可以看到索引是作为对象创建的,而不是作为防止插值的浮点创建的.
(Pdb) result.index
Index([20.0, 30.0, 40.0, 50.0, 75.0, 100.0, 0.8], dtype=object)
我没有设法将系列索引强制为float或能够对原始数据帧执行插值.
我也试过
(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一直失败.
编辑2
索引转向对象,因为值的类型为Decimal.虽然我不知道为什么值会影响索引….我只是进行一次转换.
解决方法:
这样行吗?
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。