web-dev-qa-db-fra.com

Pandas KeyError: valeur non indexée

J'ai le code suivant,

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)

Cela a toujours fonctionné jusqu'à ce que le fichier csv ne soit pas suffisamment couvert (de tous les jours de la semaine). Par exemple, avec le fichier .csv suivant,

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

Je vais avoir l'erreur suivante:

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

Il semble y avoir une solution très simple, mais je suis trop nouveau pour Python pour savoir comment le réparer).

22
xpt

Utilisez reindex pour obtenir toutes les colonnes dont vous avez besoin. Cela conservera ceux qui sont déjà là et mettra dans des colonnes vides sinon.

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

Ainsi, votre exemple de code entier devrait ressembler à ceci:

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)
20
piRSquared

J'ai eu un problème très similaire. J'ai eu la même erreur parce que le csv contenait des espaces dans l'en-tête. Mon csv contenait un en-tête "Genre" et je l'avais listé comme:

[['Gender']]

S'il est assez facile pour vous d'accéder à votre csv, vous pouvez utiliser la formule Excel trim() pour découper les espaces des cellules.

ou l'enlever comme ça

df.columns = df.columns.to_series().apply(lambda x: x.strip())

9
ILikeWhiskey

J'ai eu le même problème.

Au cours du premier développement, j'ai utilisé un fichier .csv (une virgule comme séparateur) que j'ai légèrement modifié avant de l'enregistrer. Après avoir enregistré les virgules est devenu un point-virgule.

Sous Windows, cela dépend de l'écran de personnalisation "Options régionales et linguistiques" dans lequel vous trouvez un séparateur de liste. C'est le caractère que les applications Windows s'attendent à être le séparateur CSV.

Lors du test d'un nouveau fichier, j'ai rencontré ce problème.

J'ai déjà supprimé l'argument 'sep' de la méthode read_csv:

df1 = pd.read_csv('myfile.csv', sep=',');

après:

df1 = pd.read_csv('myfile.csv');

De cette façon, le problème a disparu.

0
Paul Gheno