Abfrage aus einer Liste und ausgeben der Informationen

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
melaniestein
User
Beiträge: 4
Registriert: Freitag 15. Mai 2020, 14:10

Hallo ihr Lieben,

durch die aktuell verrückte Zeit versuche ich die Zeit sinnvoll zu nutzen und bin dabei mir Python bei zu bringen. :mrgreen:

Nun hänge ich leider schon länger an einem Problem und hoffe, hier Hilfe zu bekommen!

Folgende Grundlage ist gegeben:

1. Ich lese ein CSV-Datei ein, mit verschiedenen Informationen (ID's, Namen, Datum, etc.)
2. Die Datumsspalte kann auch 'nok' enthalten, d.h. es ist kein Datum bekannt.
3. Ich habe eine neue liste erstellt

Code: Alles auswählen

testliste = []
4. Ich bin mir einer for-Schleife die Spalte in der csv-Datei durch. Wenn ein Datum gefunden wurde wurde der Booleanwert 'True' an dem index gespeichert, ansonsten 'false'.

Code: Alles auswählen

for index, eintrag in enumerate(list['Nachricht']):
    if not 'nok' in str(eintrag): 
        testliste.append(True)
        
    else:
        testliste.append(False) 
5. Jetzt möchte ich die´Liste, welche die verschiedenen Boolenwerte enthält, auf die ursprüngliche Liste anwenden. (der index ist ja gleich!!) und mir die Informationen von allen reihen, die als false markiert sind, als neue Excel datei speichern lassen.

Kann mir jemand helfen? Bin auch gerne über Tipps, Links oder sonsitges sehr sehr dankbar!

Vielen Dank und ein schönes Wochenende
Melli
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

Hallo,

leider komme ich nicht ganz mit, da ich z.B. nicht weis wie list['Nachricht'] entstehet.
Wenn ich dich richtig verstehe, müsste alles was False enthält doch 'nok' im Eintrag haben oder nicht?
Wie genau greifst du auf die .csv Datei zu? Welches Modul benutzt du?
Warum schreibst du die False einträge nicht direkt in eine csv sondern machst diesen Zwischenschritt?

list ist ein von pyhon schon belegter Begriff um einen Object zu einer Liste zu machen. Daher ist es sehr ungeschickt etwas list zu nennen. Außerdem scheint list ein dictionary zu sein, was auch ein wenig verwirrend ist.

Viele Grüße
NPC
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Filter doch sofort die Ergebnisliste. Füge also nicht True oder False sondern, halt nur im zweiten Fall, `eintrag` zur Ergebnisliste hinzu.
`list` ist der Name des list-Typs und sollte nicht überschrieben werden. `index` wird nicht benutzt, ist aber auch überflüssig. `Eintrag` ist entweder schon ein String, dann ist der str-Aufruf unnötig, oder es ist kein String, dann ist der Aufruf falsch.
Das lässt sich kürzer ohne if schreiben:

Code: Alles auswählen

for eintrag in list['Nachricht']:
    testliste.append('nok' not in eintrag)
melaniestein
User
Beiträge: 4
Registriert: Freitag 15. Mai 2020, 14:10

@NPC:

Auf die CSV Datei greife ich wie folgt zu:

Code: Alles auswählen

liste = pd.read_csv("Data.csv",
                  usecols = ["ID", 
                             "Name", 
                             "Nachricht"])
Du hast recht mit den Begriff list. Das war mir nicht bewusst, danke dafür! Habe den namen meiner Liste jetzt auf 'liste' umgenannt. Generell arbeite ich mit Jupyter Notebook.
Warum schreibst du die False einträge nicht direkt in eine csv sondern machst diesen Zwischenschritt?
so ganz sicher bin ich mir da nicht.. ich habe jetzt schon versucht mit

Code: Alles auswählen

for zeile in [testliste]:
    testliste.drop([zeile]) if 'nok null' in zeile['Nachricht'] else None
die Zeilen automatisch zu löschen.. aber irgendwie komm ich hier absolut nicht weiter.

Kannst du dir mit meinen Erklärungen ein Bild der Situation machen oder fehlen dir weitere Informationen?

Vielen Dank schon mal und liebe Grüße!
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

Du hast keine Liste, sondern ein DataFrame. Das macht einen erheblichen Unterschied. Listen sind eine eingebaute Datanstruktur von Python. DataFrames sind eher als Tabellen aufzufassen.
Zunächst würde ich der Konsistenz halber die "nok" durch NaT ersetzen - das kann beim Parsen der Daten passieren. Dann kannst du dir alles weitere abspeichern.

Code: Alles auswählen

import pandas as pd

DATEN = {"id": [0, 1, 2, 3, 4, 5, 6, 7],
         "name": ["Lorem", "ipsum", "dolor", "sit", "amet", "consetetur", "sadipscing", "elitr"],
         "datum": ["2020-04-01", "nok", "2018-07-12", "2017-12-06", "nok", "1989-06-08", "nok", "nok"]
         }
df = pd.DataFrame(DATEN)
df = df.set_index("id")
df.datum = pd.to_datetime(df.datum, errors="coerce")
df[df.datum.isnull()].to_excel("ohne_datum.xlsx")
Genauso kannst du die Zeilen natürlich auch löschen oder was immer du willst damit anstellen.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@melaniestein: Okay, Du hast also gar keine Liste sondern einen Pandas-DataFrame. Das ist was komplett anderes und wird komplett anders behandelt als Listen. In Deinem Fall würde man mit der Nachricht-Spalte eine Maske erstellen und die als Index in den Dataframe verwenden. Komplett ungetestet:

Code: Alles auswählen

result = data[data["Nachricht"] != "nok"]
Oder näher an Deinem zweiten Beispiel dran:

Code: Alles auswählen

result = data[~data["Nachricht"].str.contains("nok null", regex=False)]
Speziell das Code-Beispiel mit der ``for``-Schleife legt nahe, dass Du dringend die Grundlagen lernen solltest. In der Python-Dokumentation gibt es beispielsweise ein Tutorial.

Und danach dann die Grundlagen von Numpy und Pandas. Beide Projekte haben eine ziemlich gute und umfangreiche Dokumentation, inklusive Einsteigermaterial.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten