2016-07-19 8 views
5

Ich habe den folgenden Code,Pandas KeyError: Wert nicht im Index

df = pd.read_csv(CsvFileName) 

p = df.pivot_table(index=['Hour'], columns='DOW', values='Changes', aggfunc=np.mean).round(0) 
p.fillna(0, inplace=True) 

p[["1Sun", "2Mon", "3Tue", "4Wed", "5Thu", "6Fri", "7Sat"]] = p[["1Sun", "2Mon", "3Tue", "4Wed", "5Thu", "6Fri", "7Sat"]].astype(int) 

Es war schon immer gearbeitet, bis die CSV-Datei nicht genügend Deckung hat (von allen Wochentagen). Für zB mit der folgenden CSV-Datei,

DOW,Hour,Changes 
4Wed,01,237 
3Tue,07,2533 
1Sun,01,240 
3Tue,12,4407 
1Sun,09,2204 
1Sun,01,240 
1Sun,01,241 
1Sun,01,241 
3Tue,11,662 
4Wed,01,4 
2Mon,18,4737 
1Sun,15,240 
2Mon,02,4 
6Fri,01,1 
1Sun,01,240 
2Mon,19,2300 
2Mon,19,2532 

Ich werde die folgende Fehlermeldung erhalten:

KeyError: "['5Thu' '7Sat'] not in index" 

Es scheint eine sehr einfache Lösung zu haben, aber ich bin einfach zu neu in Python zu wissen, wie man es repariert. Bitte helfen Sie. Vielen Dank.

+0

Ist einfach 'p = p.astype (int)' nicht ausreichend? Es ist schwer zu sagen, warum Sie die Spalten so indizieren, die beiden Listen sehen identisch aus und aus Ihren Eingabedaten sieht es nicht so aus, als würden Sie * Spalten auf diese Weise ausschließen. – jedwards

+0

Auch wenn Sie die Spalten, die Sie betrachten, unterteilen (d. H. "['5Thu' '7Sat']' 'ausschließen), werden Sie immer noch auf Fehler stoßen, die 'np.nan' auf ein' int' übertragen. Sie können einen anderen Füllwert (für fehlende Einträge) verwenden, um dieses Problem zu umgehen. – Alex

+0

Schließlich werde ich alle Wochentage im Index benötigen (z. B. '5Thu' '7Sat'), weil ich sie als nächstes plotten werde. Also suche ich nach Möglichkeiten, sie alle hinzuzufügen, ohne die Durchschnittswerte zu beeinflussen. – xpt

Antwort

7

Verwenden Sie reindex, um alle benötigten Spalten zu erhalten. Es bewahrt die, die bereits da sind, und setzt sonst leere Spalten ein.

p = p.reindex(columns=['1Sun', '2Mon', '3Tue', '4Wed', '5Thu', '6Fri', '7Sat']) 

So Ihres gesamtes Codebeispiel soll wie folgt aussehen:

df = pd.read_csv(CsvFileName) 

p = df.pivot_table(index=['Hour'], columns='DOW', values='Changes', aggfunc=np.mean).round(0) 
p.fillna(0, inplace=True) 

columns = ["1Sun", "2Mon", "3Tue", "4Wed", "5Thu", "6Fri", "7Sat"] 
p = p.reindex(columns=columns) 
p[columns] = p[columns].astype(int) 
2

ich ein sehr ähnliches Problem hatte. Ich habe den gleichen Fehler, weil der CSV Leerzeichen in der Kopfzeile enthielt. Meine csv enthalten einen Header „Gender“ und ich hatte es aufgeführt als:

[['Gender']] 

Wenn es einfach genug ist, damit Sie Ihre csv zugreifen zu können, können Sie die Formel Excel verwenden trim() alle Leerzeichen der Zellen zu befestigen.

+0

Ich fürchte, dass meins ist ein völlig anderer Fall: _ "Es hat immer funktioniert, bis die CSV-Datei nicht genügend Abdeckung" _, obwohl die Symptome sind *** *** ***. Aber danke für deine Eingabe. – xpt