微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

插入序列与浮点索引

我有以下数据框

   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 举报,一经查实,本站将立刻删除。

相关推荐