invalid literal for int() with base 10

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
horatio.cain
User
Beiträge: 3
Registriert: Mittwoch 5. August 2020, 10:03

Moin,

ich habe hier eine kleine Übungscsv die wie folgt aussieht:
Bild

Wenn ich die mit pd.read_csv einlese passt auch alles soweit:

Code: Alles auswählen

import pandas as pd
df = pd.read_csv("./meinecsv.csv", sep=";", decimal="." , encoding="utf-8", 
                 dtype = {"Farbe" : "int", "Menge" : "int"}) 
ff = df.pivot(index='Artikelname', columns='Farbe')['Menge'].fillna('x')
ff.dtypes
Farbe           int32
Menge           int32
Artikelname    object

Wenn allerdings der Pivot ausgeführt wird, ist alles dann object.

Eigentlich sollte alles INT sein und am liebsten würde ich hier schon sagen "Artikelname : int"

Code: Alles auswählen

import pandas as pd
df = pd.read_csv("./meinecsv.csv", sep=";", decimal="." , encoding="utf-8", 
                 dtype = {"Farbe" : "int", "Menge" : "int","Artikelname" : "int"}) 
ff = df.pivot(index='Artikelname', columns='Farbe')['Menge'].fillna('x')
ff
Bekomme aber dann logischerweise den folgenden Fehler.
invalid literal for int() with base 10: 'ALT9995'

Lasse ich die dtype Zuweisung weg, sieht es schon im Prinzip ganz gut aus.
Bild
Nur benötige ich für die weitere Verarbeitung bei Artikelname INT

Gibt es eine Möglichkeit so eine Ausnahme abzufangen? Ich versuchte es bereits wie folgt:
Suche in df['Artikelname'] nach dtype INT, dann bist du True.

Code: Alles auswählen

bool = []
for zahl in df.Artikelnummer:
    if zahl >= 1:
        bool.append(True)
    else:
        bool.append(False)
Leider finde ich nicht die richtigen Stellen in der Doku.
Würde mich freuen wenn jemand meine Lösungsansatz bewerten könnte.
Vielen Dank
Benutzeravatar
__blackjack__
User
Beiträge: 13071
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@horatio.cain: Wie soll denn "ALT9995" eine ganze Zahl sein?

Und es ist nicht nach dem `pivot()` alles `object`, sondern nachdem `fillna()`, denn "x" ist nun mal auch keine Zahl, also kann die Spalte dann nur noch `object` als kleinsten gemeinsamen Nenner zwischen Zahlen und Zeichenketten haben. Warum machst Du das denn? `DataFrame` ist nix was ”schön” aussehen soll, das ist zum arbeiten mit Daten und ein nicht vorhandender Wert ist `pandas.NA` und nicht die Zeichenkette "x". Das kann man irgendwann ganz am Ende machen wenn man ein Ergebnis darstellen möchte, aber nicht mit Daten mit denen man arbeiten will. Und selbst dann auch eher in der Methode mit der die Daten dann in eine andere Repräsentation überführt werden und nicht in den Daten selbst. Also beispielsweise über das `na_rep`-Argument bei `DataFrame.to_csv()`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten