Pandas插值函数返回NaN

3
我正在尝试对每16毫秒(60hz)的位置数据进行基本插值。当我尝试在pandas 0.14上使用dataframe插值时,它告诉我我的数据集中只有NaN(这是不正确的)。当我尝试运行从dataframe提取的单个系列时,它返回相同的系列,没有填充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)

before

df.interpolate(method='values')

插值法解决了问题。

能展示一下 df.info() 吗?你可能有 object 类型的数据。 - Jeff
df0.info() <class 'pandas.core.frame.DataFrame'> Float64Index: 100 entries, 0.0 to 1650.0 Data columns (total 3 columns): x 46 non-null object y 46 non-null object ms 100 non-null object dtypes: object(3) - jbbj94
它们是对象数据类型 - 是否应该将它们转换为其他类型? - jbbj94
1
“object”数据类型不好,只有类似字符串的应该使用“object”数据类型。你是如何生成/读取这些数据的? - Jeff
他们只是用普通的pd.csv_read读取了数据。我所做的只是使用df = df[1:].reset_index(drop=True)删除了额外的标题行,并使用df.rename(columns={'X center':'x', 'Y center': 'y'},inplace=True)重命名了列。我有什么做错的吗? - jbbj94
额外的标题可能是一个字符串行,请使用skip_rows(如果我没记错的话,这是选项名称),然后不要干扰类型推断。 - Jeff
2个回答

2

感谢Jeff的启发,根据您所做的编辑。

新增:

df = df.astype(float)

之前

df.interpolate(method='values')

对我来说,插值也解决了问题。除非你在子选择列集,否则不需要指定列。


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

我运行了你的代码,也成功地复现了。我还执行了以下操作来添加NaN行:df = df.reindex(pd.Series(arange(0,hz2ms(60)*100,hz2ms(60)))),其中hz2ms是一个辅助函数,返回1000/hz。 - jbbj94

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接