2016-12-12 20 views
2

Ist es möglich, Pandas zu machen. read_csv() einen Fehler auslösen, wenn eine in Usecols angegebene Spalte nicht in der Eingabedatei gefunden wird? Z.B. im folgende Beispiel, würde ich Pandas mag eine Ausnahme zu erhöhen, da es keine Spalte „Hallo“ in der Input-Datei mit dem Namen:Pandas read_csv usecols akzeptieren nicht vorhandene Spaltennamen

import pandas as pd 

# Write dummy-data 
csv = r"""col1,col2,col3 
one,two,three""" 
with open("data.csv", "w") as out: 
    out.write(csv) 

# Read dummy-data to DF 
df = pd.read_csv("data.csv", usecols=["col1", "col2", "hello"]) 
print df.to_string(index=False) 

Ausgang:

col1 col2 col3 
one two NaN 

So Pandas liest die dritte Spalte Name in der Datei ("col3") und füllt es mit NaNs, anstatt einen Fehler zu erzeugen, dass "Hallo" nicht existiert. Ich möchte beim Lesen der Datei benachrichtigt werden, anstatt den Dateiinhalt nach dem Einlesen in den Speicher überprüfen zu müssen.

Antwort

9

Sie könnten nur den Header und Test lesen, wenn alle erwarteten Spaltennamen vorhanden sind, unter Verwendung von isin:

In [10]: 
import io 
csv = r"""col1,col2,col3 
one,two,three""" 
# Read dummy-data to DF 
cols=["col1", "col2", "hello"] 
df = pd.read_csv(io.StringIO(csv), usecols=cols, nrows=0) 
df.columns.isin(cols) 

Out[10]: 
array([ True, True, False], dtype=bool) 

Sie all verwenden können, um zu testen, ob alle Spalten vorhanden sind:

In [11]: 
df.columns.isin(cols).all() 

Out[11]: 
False 

zusätzlich Sie kann die Maske invertieren, um den fehlenden Farbwert zu finden:

Sie können diese Logik in eine Benutzerfunktion einfügen, um Ihnen eine Liste der fehlenden Spaltennamen zurück zu geben:

def missingCol(cols, path): 
    read_cols = pd.read_csv(path, usecols=cols, nrows=0).columns 
    return np.array(cols)[~read_cols.isin(cols)].tolist() 
Verwandte Themen