2014-06-19 120 views
2

我试图在60hz(~16ms)间隔内进行位置数据的基本插值。当我尝试在数据框上使用熊猫0.14插值时,它告诉我我的数据集中只有NaN(不正确)。当我尝试在从数据框中拉出的单个序列上运行它时,它将返回相同的序列,但不填充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 

编辑:

道具杰夫鼓舞的解决方案。

添加:

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

df.interpolate(method='values') 

插值的伎俩。

+0

可以显示df.info(); ü概率有对象dtypes – Jeff

+0

df0.info() <类 'pandas.core.frame.DataFrame'> Float64Index:100个条目,0.0至1650.0 数据列(总3列): X 46非空对象 y 46非空对象 ms 100非空对象 dtypes:object(3) – jbbj94

+0

它们是对象dtypes - 它们是否应该转换为某种东西? – jbbj94

回答

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 
+0

我跑你的,它也转载。我还做了以下操作来添加NaN行:'df = df.reindex(pd.Series(arange(0,hz2ms(60)* 100,hz2ms(60))))',其中hz2ms是一个辅助函数,返回1000 /赫兹 – jbbj94

1

根据您的编辑与道具杰夫鼓舞的解决方案。

添加:

df = df.astype(float) 

df.interpolate(method='values') 

插值为我做的伎俩也。除非您正在子选择列集,否则不需要指定列。