2013-04-22 189 views
4

我將np.nan分配給DataFrame的列中的缺失值。然後使用to_csv將DataFrame寫入到csv文件中。如果我使用文本編輯器打開文件,則生成的csv文件在缺失值的逗號之間沒有任何內容。但是當我使用read_csv將該csv文件讀回到DataFrame中時,缺少的值將成爲字符串'nan'而不是NaN。因此,isnull()不起作用。例如:Pandas read_csv用字符串'nan'填充空值,而不是解析日期

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分配給缺失值並仍然解析有效日期?

+0

你能否包含csv的頭部(所以我們可以重新創建)? – 2013-04-22 23:18:25

回答

3

您可以通過read_csv函數調用中的na_values=["nan"]參數。這將讀取字符串nan值並將其轉換爲適當的np.nan格式。

有關更多信息,請參閱here

+0

對不起,也許我沒有解釋清楚。我不想將字符串'nan'歸類爲NaN。我說的是,read_csv將csv文件中的空值讀入字符串'nan',假定爲NaN。如果我用文本編輯器打開csv文件,兩個逗號之間沒有任何內容。 – ezbentley 2013-04-22 22:58:35

+1

嘗試'na_values = ['nan','']'這應該讀取字符串nan和空字符串值作爲np.nan。 – bdiamante 2013-04-22 23:50:57

+2

這仍然不起作用。我認爲na_values選項不適用於被解析爲日期的列。問題是真的parse_dates不適用於缺少值的列。 – ezbentley 2013-04-22 23:54:59

7

這是當前解析器中的一個bug,請參閱:https://github.com/pydata/pandas/issues/3062 簡單的解決方法是在讀取它後強制轉換列(並且將用NaT填充,這是非A-Time標記,相當於到日期時間爲止)。這應該在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] 

工作,如果字符串「南」實際上可以出現在你的數據,你可以這樣做:

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] 
+0

to_datetime是否使用字符串'nan'?它仍然不適合我。它看起來像你的df.date已經包含一個有效的NaN,而read_csv給了我一個字符串'南'。請參閱我的編輯。謝謝。 – ezbentley 2013-04-23 00:19:41

+0

嘗試更新的解決方案(這是一些手動),但與''na_values = ['南']''傳遞給read_csv你可以實現這個很容易 – Jeff 2013-04-23 00:24:15

+0

我認爲這樣做手動。但最根本的問題是,如果您要求read_csv將列解析爲日期,並且該列包含缺失值,那麼read_csv將不會分析日期並將字符串'nan'替換爲缺少的值。因此,na_values = ['nan']將不會做任何事情,因爲您的更新意味着'nan'不存在於原始csv文件中。 – ezbentley 2013-04-23 04:36:30

0

我得到了同樣的問題。使用導入csv文件

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

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

這種情況是,在指定dataframe中的日期列並使用read_csv導入數據後,空日期列將填充字符串'nan'而不是NaN。

後者可以被numpy和pandas識別爲NULL,而第一個不能。

一個簡單的解決方案是:

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

然後你應該是好去!