6

我分配np.nan给 DataFrame 列中的缺失值。然后使用 to_csv 将 DataFrame 写入 csv 文件。如果我使用文本编辑器打开文件,则生成的 csv 文件在缺失值的逗号之间没有任何内容。但是当我使用 read_csv 将该 csv 文件读回 DataFrame 时,缺失的值变成了字符串'nan'而不是 NaN。结果,isnull()不起作用。例如:

In [13]: df
Out[13]: 
   index  value date
0    975  25.35  nan
1    976  26.28  nan
2    977  26.24  nan
3    978  25.76  nan
4    979  26.08  nan

In [14]: df.date.isnull()
Out[14]: 
0    False
1    False
2    False
3    False
4    False

我做错什么了吗?我应该分配一些其他值而不是np.nan缺失值,以便isnull()能够拾取吗?

编辑:对不起,忘了提到我还设置了 parse_dates = [2] 来解析该列。该列包含缺少某些行的日期。我希望缺少的行是NaN.

EIDT:我刚刚发现问题确实是由于 parse_dates 造成的。如果日期列包含缺失值,read_csv 将不会解析该列。相反,它将日期作为字符串读取并将字符串“nan”分配给空值。

In [21]: data = pd.read_csv('test.csv', parse_dates = [1])

In [22]: data
Out[22]: 
   value      date id
0      2  2013-3-1  a
1      3  2013-3-1  b
2      4  2013-3-1  c
3      5       nan  d
4      6  2013-3-1  d

In [23]: data.date[3]
Out[23]: 'nan'

pd.to_datetime 也不起作用:

In [12]: data
Out[12]: 
   value      date id
0      2  2013-3-1  a
1      3  2013-3-1  b
2      4  2013-3-1  c
3      5       nan  d
4      6  2013-3-1  d

In [13]: data.dtypes
Out[13]: 
value     int64
date     object
id       object

In [14]: pd.to_datetime(data['date'])
Out[14]: 
0    2013-3-1
1    2013-3-1
2    2013-3-1
3         nan
4    2013-3-1
Name: date

有没有办法让 read_csv parse_dates 处理包含缺失值的列?即,将 NaN 分配给缺失值并仍然解析有效日期?

4

3 回答 3

7

这目前是解析器中的一个 buglet,请参阅:https ://github.com/pydata/pandas/issues/3062 简单的解决方法是在您读入该列后强制转换该列(并将使用 NaT 填充 nans,即非时间标记,相当于日期时间的 nan)。这应该适用于 0.10.1

In [22]: df
Out[22]: 
   value      date id
0      2  2013-3-1  a
1      3  2013-3-1  b
2      4  2013-3-1  c
3      5       NaN  d
4      6  2013-3-1  d

In [23]: df.dtypes
Out[23]: 
value     int64
date     object
id       object
dtype: object

In [24]: pd.to_datetime(df['date'])
Out[24]: 
0   2013-03-01 00:00:00
1   2013-03-01 00:00:00
2   2013-03-01 00:00:00
3                   NaT
4   2013-03-01 00:00:00
Name: date, dtype: datetime64[ns]

如果字符串 'nan' 确实出现在您的数据中,您可以这样做:

In [31]: s = Series(['2013-1-1','2013-1-1','nan','2013-1-1'])

In [32]: s
Out[32]: 
0    2013-1-1
1    2013-1-1
2         nan
3    2013-1-1
dtype: object

In [39]: s[s=='nan'] = np.nan

In [40]: s
Out[40]: 
0    2013-1-1
1    2013-1-1
2         NaN
3    2013-1-1
dtype: object

In [41]: pandas.to_datetime(s)
Out[41]: 
0   2013-01-01 00:00:00
1   2013-01-01 00:00:00
2                   NaT
3   2013-01-01 00:00:00
dtype: datetime64[ns]
于 2013-04-23T00:05:19.430 回答
3

您可以在函数调用中传递na_values=["nan"]参数。read_csv这将读取字符串 nan 值并将它们转换为正确的np.nan格式。

请参阅此处了解更多信息。

于 2013-04-22T22:47:54.493 回答
0

我遇到了同样的问题。使用导入 csv 文件

dataframe1 = pd.read_csv(input_file, parse_date=['date1', 'date2'])

其中 date1 包含有效日期,而 date2 是一个空列。显然 dataframe1['date2'] 充满了一整列'nan'。

情况是,在从数据框中指定日期列并使用 read_csv 导入数据后,空的日期列将填充“nan”字符串而不是 NaN。

后者可以被 numpy 和 pandas 识别为 NULL 而第一个不能。

一个简单的解决方案是:

from numpy import nan
dataframe.replace('nan', nan, inplace=True)

然后你应该好好去!

于 2017-05-15T19:35:07.617 回答