6

np.nanDataFrame の列の欠損値に割り当てます。DataFrame は、to_csv を使用して 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

これは現在、パーサーのバグレットです。https ://github.com/pydata/pandas/issues/3062 を参照 してください。 Not-A-Time マーカー、日時の 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 に答える