Text in CSV Datei schreiben (spaltenweise)

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
Fjellnir
User
Beiträge: 3
Registriert: Sonntag 23. Februar 2025, 10:39

Hallo zusammen,

ich habe erst lange hier geguckt, bevor ich diesen Post schreibe, weil ich erst wissen wollte, ob jemand mal ein ähnliches Problem wie ich hatte.
Fand jedoch nichts treffendes (vielleicht auch falsch gesucht).

Sideinfo: Ich bin recht neu bei Python unterwegs und habe mir letztes Jahr so die Basics der Basic mit diversen Videos und Google erarbeitet und sitze nun seit Januar an meinem ersten eigen kleinen Projekt.
Komme auch alleine sehr gut zurecht, in dem ich mir nötige unterstützung aus verschiedensten Quellen hole.
Doch jetzt gerade stehe ich tatsächlich vor einem etwas für mich schwierigeren Brocken.

Was ist mein Ziel?
Für mein Projekt arbeite ich mit einer CSV Datei aus der ich meine Daten ins Program lese und verarbeite (klappt auch alles super), nun möchte ich aber diese CSV Datei am liebsten vom Programm aus bearbeiten können.
Soll heißen ich möchte einfach zum Beispiel in Spalte A - die mit einem Header betitelt ist einen bestimmten Text einfach darunter anhängen (selbe Spalte eine Zeile darunter), das Gleiche natürlich auch für Spalte B und so weiter.

Ich habe insgesammt 56 Zeilen und 14 Spalten (die sollen von der Spaltenanzahl aus so bleiben).

Ich habe auch schon zwei Lösungsansätze und auch hin und her probiert (ich lerne am besten durch probieren, statt nur durch lesen) und so sieht das bei mir gerade aus:

Code: Alles auswählen

import pandas as pd

df = pd.read_csv("../Essensgenerator new/Essenstabelle2.2.csv")

# to_string gibt die gesamte Tabelle aus
print(df.to_string())

# Die Dictionary Keys sind auch die bereits bestehenden Header der CSV Tabelle
new_meal = {"Kartoffeln (F)": str(input("kart_f: ", )),
            "Nudeln (F)": str(input("nud_f: ", )),
            "Reis (F)": str(input("reis_f: ", )),
            "Couscous/Quinoa/Bulgur (F)": str(input("cous_f: ", )),
            "Wraps/Burger/Baguette (F)": str(input("wrap_f: ", )),
            "Multi (F)": str(input("mult_f: ", )),
            "Suppe/Eintopf (F)": str(input("supp_f: ", )),
            "Kartoffeln (V)": str(input("kart_v: ", )),
            "Nudeln (V)": str(input("nud_v: ",)),
            "Reis (V)": str(input("reis_v: ", )),
            "Couscous/Quinoa/Bulgur (V)": str(input("cous_v: ", )),
            "Wraps/Burger/Baguette (V)": str(input("wrap_v: ", )),
            "Multi (V)": str(input("mult_v: ", )),
            "Suppe/Eintopf (V)": str(input("supp_v: ", ))}

df = pd.DataFrame(new_meal, [0, 14])
df.to_csv("../Essensgenerator new/Essenstabelle2.2.csv", mode="a", header=False,index=False)
So das ist eine Option, die ich gefunden habe und für mich nutze - Ergebnis ist nur, dass die Inhalte passend zu den Headern darunter angehangen werden, jedoch einfach nur in die Zeile 57 und das in jede Spalte.
Spalte B zum Beispiel hat ab Zeile 21 leere Zellen, die dann übersprungen werden.

Nun weiß ich dass diese Zeilen / Zellen mit den Werten "NaN" gefüllt sind.
Deshalb hatte ich es als nächstes mit dem hier versucht:

Code: Alles auswählen

 import pandas as pd

df = pd.read_csv("../Essensgenerator new/Essenstabelle2.2.csv")

# to_string gibt die gesamte Tabelle aus
print(df.to_string())

# Die Dictionary Keys sind auch die bereits bestehenden Header der CSV Tabelle
new_meal = {"Kartoffeln (F)": str(input("kart_f: ", )),
            "Nudeln (F)": str(input("nud_f: ", )),
            "Reis (F)": str(input("reis_f: ", )),
            "Couscous/Quinoa/Bulgur (F)": str(input("cous_f: ", )),
            "Wraps/Burger/Baguette (F)": str(input("wrap_f: ", )),
            "Multi (F)": str(input("mult_f: ", )),
            "Suppe/Eintopf (F)": str(input("supp_f: ", )),
            "Kartoffeln (V)": str(input("kart_v: ", )),
            "Nudeln (V)": str(input("nud_v: ",)),
            "Reis (V)": str(input("reis_v: ", )),
            "Couscous/Quinoa/Bulgur (V)": str(input("cous_v: ", )),
            "Wraps/Burger/Baguette (V)": str(input("wrap_v: ", )),
            "Multi (V)": str(input("mult_v: ", )),
            "Suppe/Eintopf (V)": str(input("supp_v: ", ))}

df.fillna(new_meal, inplace=True)
df.to_csv("../Essensgenerator new/Essenstabelle2.2.csv", header=True, index=False)
Doch damit erhalte ich nur das Ergebnis, dass sämtliche "NaN" durch die Input Inhalte ersetzt werden (also quasi das, was der Befehl halt macht) und somit aber unter Spalte A dann kein neuer Eintrag ist, weil darunter kein "NaN" Wert ist, sondern eine neue Zeile beginnt.

-------------------------------------------------------------------------------------------------------
Jetzt wäre mein Plan halt beides irgendwie zu vermischen - ich möchte diese Inputs gezielt in die jeweiligen Spalten eintragen können, aber gleichzeitig die Zellen, in denen gerade ein "NaN" Wert ist einfach ausgetauscht wird - aber wirklich nur die EINE nächste Zelle.

Ich hoffe ich konnte mein Anliegen einigermaßen gut erläutern, wenn es noch unklarheiten gibt, lasst es mich wissen.
Ist auch mein erstes Mal, dass ich selber was in einem Forum erstelle, deswegen verzeit mir bitte, wenn ich an manchen Stellen etwas inkompetent anstelle.

Gruß Fjellnir
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

Du möchtest also jede Spalte einzeln durchgehen, jeweils den ersten NaN-Eintrag suchen und diesen ersetzen. Falls kein NaN gefunden wird, soll eine neue Zeile nur mit NaNs angehängt werden und dann dort die passende Zelle gefüllt werden.
Genau dieses Vorgehen musst Du selbst mit einer for-Schleife programmieren, da gibt es nichts "fertiges".
Fjellnir
User
Beiträge: 3
Registriert: Sonntag 23. Februar 2025, 10:39

Erstmal danke für die super schnelle Antwort

Tatsächlich, war das so eines der letzten Optionen, die ich im Hinterkopf hatte (also jetzt nicht 1 zu 1 so wie du beschrieben hattest, deshalb danke für deinen Tipp).

Dennoch wollte ich vorerst wissen, ob es da nicht doch ne kompaktere Lösung mittels pandas gibt.

Nun denn so sei es.
Ist aber nicht schlimm, krieg ich hin

vielen Dank 😃
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fjellnir: Wenn der Dataframe bereits die entsprechenden Spaltenüberschriften hat, dann sollte man die nicht noch mal im Code wiederholen, denn man kann die ja vom Dataframe abfragen. Und dann kann man die auch für die Eingabeaufforderung verwenden und muss da nicht so kryptische Abkürzunge wie "nud_f" schreiben.

`input()` liefert bereits eine Zeichenkette, es macht keinen Sinn da `str()` mit aufzurufen. Und eigentlich sollen da doch Zahlen eingetragen wwerden‽ Das sollte man vielleicht auch prüfen und Fehleingaben sinnvoll behandeln.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Fjellnir
User
Beiträge: 3
Registriert: Sonntag 23. Februar 2025, 10:39

__blackjack__ hat geschrieben: Montag 24. Februar 2025, 13:02 @Fjellnir: Wenn der Dataframe bereits die entsprechenden Spaltenüberschriften hat, dann sollte man die nicht noch mal im Code wiederholen, denn man kann die ja vom Dataframe abfragen. Und dann kann man die auch für die Eingabeaufforderung verwenden und muss da nicht so kryptische Abkürzunge wie "nud_f" schreiben.

`input()` liefert bereits eine Zeichenkette, es macht keinen Sinn da `str()` mit aufzurufen. Und eigentlich sollen da doch Zahlen eingetragen wwerden‽ Das sollte man vielleicht auch prüfen und Fehleingaben sinnvoll behandeln.
Vielen Dank für deinen Input nochmal - das mit den Überschriften werd ich nochmal überarbeiten.

Zu den "kryptischen Abkürzungen" - die dienen tatsächlich in dem Fall, um mich in der Konsole zurecht zu finden.

Das da ist gerade auch nur ein Schnipsel von dem eigentlichen Projekt, was ich mir immer zum Rumprobieren nochmal extra zusammbastel und simuliere, sozusagen.

Und die Str() Befehle sind unnötig ja, das war nur reine Vorsichtsmaßnahmen, weil das mit nem Versuch zuvor Probleme gab, aber ja das kann ich dann im Prinzip weg lassen, geb ich dir Recht.


Ehhh
Ich sehe viel, dass Pandas und Numpy eher für mathematische Zwecke genutzt wird.
In meinem Projekt hab ich eine Tabelle mit Text, die ich einlese und dementsprechend nutze.

Mir ging es jetzt wirklich erstmal nur um dieses spaltenweise Beschreiben.
Und die Ansätze hab ich auf jeden Fall erstmal womit ich wieder weiter belesen und voran komme und weiter für mich kniffeln kann.

Nochmal vielen Dank.
Antworten