2017-08-02 151 views
3

我用下面的代碼使用熊貓read_csv熊貓:處理缺失列

headers = ["1","2","3","4","5"] 
fields = ["1", "5"] 

for chunk in pandas.read_csv(fileName, names=headers, header=0, usecols=fields, chunksize=chunkSize): 

有時我的CSV不會有列「5」讀取數據塊的CSV文件,我希望能夠處理這種情況並指定一些默認值。有沒有辦法只讀取我的CSV文件的標題而不讀取整個文件,以便我可以手動處理?或者可能是其他聰明的方式來默認缺失列的值?

+1

可能集'error_bad_lines = FALSE'。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ事情是我需要爲每行的列「5」的值,但有時整個列「5」將丟失,所以我必須回退到默認值。 error_bad_lines = False會忽略該行,不是? –

+0

是的,你是對的。不知道這個。我一直認爲熊貓會默認填充NaN。 –

回答

1

如果你通過nrows=0此讀取剛剛列列,你可以調用intersection找到共同的列值,並避免任何錯誤:

In[14]: 
t="""1,2,3,5,6 
0,1,2,3,4""" 
headers = ["1","2","3","4","5"] 
fields = ["1", "5"] 
cols = pd.read_csv(io.StringIO(t), nrows=0).columns 
cols 

Out[14]: Index(['1', '2', '3', '5', '6'], dtype='object') 

所以現在我們有列名,我們可以調用intersection找到對你的預期與實際列的有效列:

In[15]: 
valid_cols = cols.intersection(headers) 
valid_cols 

Out[15]: Index(['1', '2', '3', '5'], dtype='object') 

你可以做同樣的fields然後你就可以通過這些到您當前密碼,以避免任何異常

只是爲了證明,經過nrows=0只是讀標題行:

In[16]: 
pd.read_csv(io.StringIO(t), nrows=0) 

Out[16]: 
Empty DataFrame 
Columns: [1, 2, 3, 5, 6] 
Index: [] 
+0

是的我只是發現了關於nrows,但我正要測試它與nrows = 1,不知道計數從0開始(應該猜到)我會試試看,謝謝! –

+0

是的,你可以做到這一點並不明顯,將會更新以證明這一點 – EdChum