2017-08-02 2 views
3

ich den folgenden Code mithilfe einer CSV-Datei in Blöcken lesen Pandas mit read_csvPandas: Griff Spalte fehlt

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

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

Manchmal wird meine CSV nicht Spalte „5“ haben und ich möchte in der Lage sein Behandle diesen Fall und gib einige Standardwerte an. Gibt es eine Möglichkeit, nur die Header meiner CSV-Datei zu lesen, ohne die gesamte Datei zu lesen, damit ich das manuell behandeln kann? Oder kann eine andere clevere Möglichkeit sein, den Wert für die fehlende Spalte zu übernehmen?

+1

Möglicherweise Set 'error_bad_lines = false'. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ die Sache ist, ich brauche den Wert für die Spalte "5" für jede Zeile, aber manchmal wird die ganze Spalte "5" fehlen, so dass ich auf Standardwerte zurückgreifen muss. error_bad_lines = False ignoriert nur die Zeile, nein? –

+0

Ja, du hast Recht. Ich bin mir nicht sicher. Ich habe immer geglaubt, Pandas würden NaNs standardmäßig füllen. –

Antwort

1

Wenn Sie nrows=0 dies liest nur die Spaltenzeile übergeben, können Sie dann intersection rufen die gemeinsamen Spaltenwerte und vermeiden Fehler zu finden:

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') 

So, jetzt wir Spaltennamen haben wir intersection nennen zu finden die gültigen Spalten gegen den erwarteten und tatsächlichen Spalten:

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

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

Sie können mit fields das gleiche tun und dann können Sie diese mit Ihrem aktuellen Code passieren alle Ausnahmen zu vermeiden

Nur um zu zeigen, dass nrows=0 gerade liest die Kopfzeile vorbei:

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

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

yeah Ich habe gerade über nrows gefunden, aber ich war dabei, es mit nrows = 1 zu testen, wusste nicht, dass die Zählung bei 0 beginnt (sollte es erraten haben) Ich werde es versuchen, danke! –

+0

Ja, es ist nicht offensichtlich, dass Sie dies tun können, wird aktualisiert, um dies zu beweisen – EdChum