熊猫插入返回NaNs

时间:2014-06-19 21:25:29

标签: python-2.7 pandas time-series interpolation

我试图以60hz(~16ms)的间隔对位置数据进行基本插值。当我尝试在数据帧上使用pandas 0.14插值时,它告诉我在我的数据集中只有NaN(不是真的)。当我尝试在从数据帧中拉出的单个系列上运行它时,它返回相同的系列而没有填充NaN。我已经尝试使用不同的方法将索引设置为整数,摆弄轴并限制参数插值功能 - 没有骰子。我做错了什么?

df.head(5) : 
         x        y        ms
0  20.5815  14.1821  333.3333
1      NaN      NaN       350
2  20.6112  14.2013  366.6667
3      NaN      NaN  383.3333
4  20.5349  14.2232       400


df = df.set_index(df.ms) # set indices to milliseconds

当我尝试跑步时

df.interpolate(method='values')

我收到此错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-462-cb0f1f01eb84> in <module>()
     12 
     13 
---> 14 df.interpolate(method='values')
     15 
     16 

/Users/jsb/anaconda/lib/python2.7/site-packages/pandas/core/generic.pyc in interpolate(self, method, axis, limit, inplace, downcast, **kwargs)
   2511 
   2512         if self._data.get_dtype_counts().get('object') == len(self.T):
-> 2513             raise TypeError("Cannot interpolate with all NaNs.")
   2514 
   2515         # create/use the index

TypeError: Cannot interpolate with all NaNs.

我也尝试过单个系列,只返回我输入的内容:

temp = df.x
temp.interpolate(method='values')

333.333333    20.5815
350.000000        NaN
366.666667    20.6112
383.333333        NaN
400.000000    20.5349 Name: x, dtype: object

编辑:

向Jeff致敬,以鼓励解决方案。

添加:

df[['x','y','ms']] = df[['x','y','ms']].astype(float)

df.interpolate(method='values')

插值完成了这个技巧。

2 个答案:

答案 0 :(得分:2)

根据您对Jeff的道具进行编辑,以启发解决方案。

添加:

df = df.astype(float)

df.interpolate(method='values')

插值也为我做了伎俩。除非您要选择列集,否则无需指定列。

答案 1 :(得分:0)

我无法重现错误(请参阅下面的复制/粘贴示例),您是否可以确保您显示的数据实际代表您的数据?

In [137]: from StringIO import StringIO

In [138]: df = pd.read_csv(StringIO("""         x        y        ms
     ...: 0  20.5815  14.1821  333.3333
     ...: 1      NaN      NaN       350
     ...: 2  20.6112  14.2013  366.6667
     ...: 3      NaN      NaN  383.3333
     ...: 4  20.5349  14.2232       400"""), delim_whitespace=True)

In [140]: df = df.set_index(df.ms)

In [142]: df.interpolate(method='values')
Out[142]: 
                 x         y        ms
ms                                    
333.3333  20.58150  14.18210  333.3333
350.0000  20.59635  14.19170  350.0000
366.6667  20.61120  14.20130  366.6667
383.3333  20.57305  14.21225  383.3333
400.0000  20.53490  14.22320  400.0000