如何正确填写这些“NaN”值?

时间:2018-01-22 17:00:56

标签: python-3.x pandas

这是我原始的数据框,其中包含NaN个值,我正在尝试填充这些值;

https://prnt.sc/i40j33

如果我使用df.interpolate(axis=1)填充NaN值,则只有部分行正确填充数字。 例如

https://prnt.sc/i40mgq

正如您在屏幕截图列中看到的那样:1981年和具有NaN值的行:3已正确填充了NaN以外的值。我想填补NaN的其余部分吗?知道我该怎么做?

2 个答案:

答案 0 :(得分:0)

使用DataFrame.interpolate()

在你的情况下它失败了,因为左边没有列,因此插值方法不知道要将其插入到:missing_value = (left_value + right_value)/2

所以你可以,例如,在左边插入一个列,所有0'(如果你想在第一列上用下一个值的一半来计算你的缺失值),这样:

df.insert(loc=0, column='allZeroes', value=0)

在此之后,您可以按原样插值并删除列

一般缺失值估算
如果Alex在问题的评论中提到,请使用df.fillna('DEFAULT-VALUE')Docs here

或做类似的事情:

df.my_col[df.my_col.isnull()] = 'DEFAULT-VALUE'

我建议您使用fillna,因为您可以使用前向填充(ffill)等方法 - 使用前一个值填充缺失 - 以及其他类似方法。

答案 1 :(得分:0)

好像你可能希望在axis=0上进行插值,按列:

>>> df = pd.DataFrame(np.arange(35, dtype=float).reshape(5,7),
                      columns=[1951, 1961, 1971, 1981, 1991, 2001, 2001],
                      index=range(0, 5))
>>> df.iloc[1:3, 0] = np.nan
>>> df.iloc[3, 3] = np.nan

>>> df.interpolate(axis=0)
   1951  1961  1971  1981  1991  2001  2001
0   0.0   1.0   2.0   3.0   4.0   5.0   6.0
1   7.0   8.0   9.0  10.0  11.0  12.0  13.0
2  14.0  15.0  16.0  17.0  18.0  19.0  20.0
3  21.0  22.0  23.0  24.0  25.0  26.0  27.0
4  28.0  29.0  30.0  31.0  32.0  33.0  34.0

目前你正在逐行插值。 “开始”系列的NaN不会被任何一侧的值填充,因此无法进行插值。

更新:pandas为adding some more optionality for this in v 0.23.0