使 pandas fillna 持久化

Making pandas fillna persistent

我正在处理一些确实包含缺失数据的 csv 数据集,这些数据集被标记为 Lücke

我按如下方式导入数据集:

MyData=pd.read_csv('filename.csv',sep=';',skiprows=19,index_col='Date',dayfirst=True,parse_dates=True, na_values='L\xfccke')

按预期工作,将 Lücke 变成更熟悉的 NaN

看着它的尾巴,我知道那里有一个 Lücke,我得到了以下结果,如预期的那样:

                     level
Date                      
2011-12-28 07:00:00    0.0
2011-12-29 07:00:00    0.0
2011-12-30 07:00:00    0.4
2011-12-31 07:00:00    0.0
2012-01-01 07:00:00    NaN

所以根据 pandas 文档 (http://pandas.pydata.org/pandas-docs/stable/missing_data.html#filling-missing-values-fillna) 一个简单的

In [23]: MyData.level.fillna(0)

应该就可以了。而它的

Out [24]:
Date
...
2011-12-29 07:00:00       0.0
2011-12-30 07:00:00       0.4
2011-12-31 07:00:00       0.0
2012-01-01 07:00:00       0.0
Name: level, Length: 14976

似乎表明它确实有效。

但是继续,我总是遇到 AttributeError: max must be larger than min in range parameter. 错误,试图用 plt.hist 绘制直方图。

所以要检查一下,我 运行 一个简单的 MyData.tail()MyData.level.tail,他们都得到了我

                     level
Date                      
2011-12-28 07:00:00    0.0
2011-12-29 07:00:00    0.0
2011-12-30 07:00:00    0.4
2011-12-31 07:00:00    0.0
2012-01-01 07:00:00    NaN

这是从哪里来的?我是否误解了 fillna,并且必须指定它实际上应该真正 替换 NaN,而不是假装?

或者这是某些 pandas 版本的错误?

默认情况下,fillna 将 return 填充的 DataFrame 而不会对其进行处理 "in-place",因此您必须这样做:

MyData.level = MyData.level.fillna(0)

或者,您可以在调用它时传递 inplace=True,它 就地工作,因此:

MyData.level.fillna(0, inplace=True)