Wert einer Zelle Ändern (Pandas/Excel/Python)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ChrisKR
User
Beiträge: 4
Registriert: Donnerstag 26. Dezember 2019, 04:44

Hallo Leute,

meine erste Frage auf diesem Forum, dass mir ja schon so sehr geholfen hat. Aber Fokus auf das Problem. :D

Meine Frage ist recht simpel jedoch finde ich bis jetzt noch nicht die Lösung. Ich habe eine kleine Excel Tabelle angelegt und möchte nun einen Wert in dieser Tabelle verändern, wie mache ich das? Wichtig ist, dass ich danach mit diesen Zahlen weiterarbeiten kann.

df.at[2,0] = 10 --> das habe ich Probiert aber sehr erfolglos, und auch sonst habe ich nicht viel gefunden.

Sorry für so eine simple Frage aber ich stehe auf dem Schlauch und habe noch nie mit Pandas gearbeitet.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

df.at[... klingt nach einem DataFrame. Das hat nichts mit Excel zu tun. Wenn du das aus einer Exceldatei erzeugt hast, ergeben Änderungen im DataFrame nicht gleichzeitig Änderungen in der ursprünglichen Datei. Sollte das der Fall sein und du willst das (veränderte) DataFrame so speichern, wie du es eingelesen hast, kannst du to_excel verwenden. Ansonsten schau dir openpyxl an.

Um einen einzelnen Wert in einem DataFrame zu ändern kannst du .at() oder .iat() verwenden. Bei .at() werden die die Zeilen und Spalten jedoch über ihr Label angesprochen, während .iat() die Indices verwendet.
Zum Beispeil

Code: Alles auswählen

>>> df 
    A B C
 4 0 2 3 
 5 0 4 1
 6 10 20 30
 
 >>> df.at[4, 'B']
 2
 
 >>> df.iat[1, 2]
 1
ChrisKR
User
Beiträge: 4
Registriert: Donnerstag 26. Dezember 2019, 04:44

Vielen Dank für die Erklärung hat mir sehr weitergeholfen!
ChrisKR
User
Beiträge: 4
Registriert: Donnerstag 26. Dezember 2019, 04:44

def Buchen_Eco1():
Plätze = PlätzeEco1.get()
df.columns
df.iat[2,0] = int(df.iat[2,0]) - Plätze
if df.iat[2,0] >=0:
df.to_csv(index=False)
Label(screen2, text = "Platzt gebucht!", fg ="blue").pack()
else:
df.iat[2,0] = int(df.iat[2,0]) + Plätze
Label(screen2, text="Es sind nicht mehr genug Plätze verfügbar.", fg ="blue").pack()

Ich habe gedacht es würde so funktionieren, aber leider ändern sich die Werte in der Excel-Tabelle nicht...könntet ihr mir da Helfen?
Ist df.to_csv(index=False) nicht richtig? Und was bedeutet index=False?
Edit: Das Programm läuft trotzdem durch es gibt keinen traceback, nur wie beschrieben überträgt der wert sich nicht in meine Tabelle.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du Dir die Dokumentation zu to_csv angeschaut, was das macht? Dann sollte klar sein, dass sich da nichts an irgendwelchen Dateien auf magische Weise ändert. `df` weiß ja nicht, dass es ürsprünglich mal aus einer Datei generiert worden ist.

Labels sollten nur bei der Erzeugung des Fensters angelegt werden und nicht später. In einer Methode kannst Du den Text des schon angelegten Labels ändern. Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen. Buchen_Eco1 hat aber gar keine, es fehlen `df`, `PlätzeEco1`, screen2`. Daher ist auch jedes nicht triviale GUI-Programm ohne Klassen nicht sauber umsetzbar. Benutze keine *-Importe. Das 1 an Eco1 läßt befürchten, dass es noch ähnliche Methoden mit anderen Ziffern gibt. Sowas macht man auch nicht, sondern versucht, allgemeine Methoden zu schreiben.
ChrisKR
User
Beiträge: 4
Registriert: Donnerstag 26. Dezember 2019, 04:44

Danke für die Kritik, jedoch ist das als Anfänger alles gar nicht so leicht und irgendwie muss man ja anfangen.
Antworten