Dataframe im Loop

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
horstel_horst
User
Beiträge: 18
Registriert: Montag 27. September 2021, 19:09

Ich möchte über eine Liste loopen und für jeden Eintrag in der liste einen neuen Dataframe erstellen. Wie füge ich den Namen des Eintrages in der Liste dem Dataframe hinzu?
Benutzeravatar
__blackjack__
User
Beiträge: 13150
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@horstel_horst: Die Frage ist nicht wirklich eindeutig. Was ist „der Name des Eintrags“ und was bedeutet es, den dem Dataframe hinzuzufügen?
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Sirius3
User
Beiträge: 17775
Registriert: Sonntag 21. Oktober 2012, 17:20

Zur Frage fehlt Kontext. Wie soll der Dataframe erstellt werden, welchen Inhalt hat die Liste? Was ist der Name eines Eintrags? Wie soll der im Dataframe stehen?
horstel_horst
User
Beiträge: 18
Registriert: Montag 27. September 2021, 19:09

Sorry, hier ein kleines Beispiel:

Code: Alles auswählen

d = [1]
for i in ('a','b'):
    a = 'temp_'
    b = str(i)
    name = a + b
    df = pd.DataFrame(d)
 
Anstelle einen Dataframe mit dem Namen "df", hätte ich gerne zwei Dataframes: "temp_a" & "temp_b"

Ist das verständlicher?
Benutzeravatar
sparrow
User
Beiträge: 4208
Registriert: Freitag 17. April 2009, 10:28

Dein Beispiel macht es noch verwirrenden.
Und du willst Objekte an dynamische Namen binden? Verstehe ich das richtig? Das macht man nicht. Dafür gibt es Datenstrukturen. Zum Beispiel ein dict. Oder, wenn eine Liste oder ein Tuple.

Und wenn das schon nicht klar ist, dann halte ich es für möglich, dass du denkst, dass das die Lösungen ein Problem ist - und du Unrecht hast.
Vielleicht solltest du mal dei ursprüngliches Problem erklären, dass du so sicher nicht lösen wirst.
Sirius3
User
Beiträge: 17775
Registriert: Sonntag 21. Oktober 2012, 17:20

Einbuchstabige Variablennamen sind schlecht, weil sie nichts über den Inhalt verraten. `i` ist doppelt schlecht, weil man bei `i` eine ganze Zahl erwartet und keinen String. Daher ist b = str(i) überflüssig, weil i schon ein String ist. Strings stückelt man nicht per + zusammen sondern benutzt Formatstrings. Abkürzungen sollte man nicht vermenden. Wenn Du Temperatur meinst, schreibe nicht Temp.
Statt dynamisch Variablen zu erzeugen, benutzt man eine passende Datenstruktur, wie z.B. Wörterbücher.

Code: Alles auswählen

data = [1]
dataframes = {}
for name in ['a','b']:
    dataframes[f"temperature_{name}"] = pd.DataFrame(data)
horstel_horst
User
Beiträge: 18
Registriert: Montag 27. September 2021, 19:09

Zunächst besten Dank für den Input, die Vorschläge machen noch nicht ganz was ich möchte.

Ich habe eine Liste mit Strings. Für jedes Element dieser Liste soll eine Dataframe gefiltert werden. Anschließend soll der gefilterte Dataframe in einen neuen Dataframe kopiert werden. Dabei soll der Wert des Filters an den Namen des Dataframes angefügt werden.

Hier der Code:

Code: Alles auswählen

d = {'names': ['a','b']}
df = pd.DataFrame(d)
names = df.names.unique().tolist()
for members in names:
    df_ = df[df['names'] == members]
Meine Frage:
1. Wie füge ich die Elemente der Liste 'a' und 'b' an 'df_' an?
Sirius3
User
Beiträge: 17775
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Antwort beleibt die gleiche: so was macht man nicht, und die Lösung ist auch die selbe:

Code: Alles auswählen

data = {'names': ['a', 'b']}
df = pd.DataFrame(data)
names = df.names.unique().tolist()
dataframes = {}
for member in names:
    dataframes[member] = df[df['names'] == member]
print(dataframes['a'])
Wobei dieser Code ganz einfach durch groupby zu ersetzen ist:

Code: Alles auswählen

data = {'name': ['a', 'b', 'a'], 'temperature': [12.4, 7.6, 13.7]}
df = pd.DataFrame(data)
dataframes = df.groupby('name')
print(dataframes.get_group('a'))
horstel_horst
User
Beiträge: 18
Registriert: Montag 27. September 2021, 19:09

Besten Dank.

Ich verstehe nicht, warum mein Vorschlag "falsch" ist. Aber ich nehme es so hin.

Zu deinem Vorschlag noch noch eine Rückfrage:
print(dataframes['a']) --> kann ich hier '['a']' in irgend einer Form durch die looping variable ersetzen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Statt dem literal ‚a‘ einfach den Namen der Variablen.

Das sind aber wirklich die absoluten Grundlagen. Und die solltest du dir durch das durcharbeiten des offiziellen Tutorials erarbeiten.

Und zur Frage warum man das nicht macht: dataframes sind tabellarische Strukturen. Du willst aber eine Zuordnung, und das erledigt man durch Wörterbücher zB. Das richtige Werkzeug eben. Man löst auch keine Radmuttern mit der Wasserpumpenzange.
horstel_horst
User
Beiträge: 18
Registriert: Montag 27. September 2021, 19:09

Sorry, aber damit kann ich immer noch keinen neue Dataframes mit den Namen df_a und df_b erzeugen.
Benutzeravatar
sparrow
User
Beiträge: 4208
Registriert: Freitag 17. April 2009, 10:28

Wir wiederholen uns.
Man legt keine Variablen mit dynamischen Namen an.
Dafür gibt es Datenstrukturen.
Das schrieb ich auch schon oben.
Bitte arbeite doch doch Pyhon und Pandas Tutorials durch.

Oder noch besser, und auch darum habe ich dich schon oben gebeten: Erkläre dein ursprüngliches Problem, denn das was du für die "Lösung" hälst ist falsch. Als erkläre, welches Problem du mit diesem (sorry, aber direkt ist manchmal besser) unsinnigen Vorgehen versuchst zu lösen.
einfachTobi
User
Beiträge: 492
Registriert: Mittwoch 13. November 2019, 08:38

Du versuchst hier auch einfach unglaublichen Murks zu machen und alle wollen dich vernünftigerweise davon abhalten.
Da du die simplen Beispiele nicht verstehst bzw. umsetzen kannst, gehe ich davon aus, dass dir die Grundlagen in Python fehlen. Das ist nicht böse gemeint.
Aber dann versuchst du hier ein Problem auf eine für dich scheinbar sinnvolle Art und Weise zu lösen, die faktisch nicht sinnvoll ist.
Dazu möchte ich gern den Hinweis von __deets__ wiederholen: "Man löst auch keine Radmuttern mit der Wasserpumpenzange".
Das Forum kann dir mit an Sicherheit grenzender Wahrscheinlichkeit einen guten Lösungsweg aufzeigen, wenn du dein eigentliches Problem/Vorhaben beschreibst, anstatt auf deinen merkwürdigen Lösungsweg zu bestehen.
horstel_horst
User
Beiträge: 18
Registriert: Montag 27. September 2021, 19:09

Ich möchte die gefilterten Dataframes in jeweils separate Excel-Tabellenblätter schreiben. Dabei soll der Name des Tabellenblatts den der 'member' haben.
Zuletzt geändert von horstel_horst am Donnerstag 11. November 2021, 16:16, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17775
Registriert: Sonntag 21. Oktober 2012, 17:20

Und an welcher Stelle brauchst Du dann dynamisch generierte Variablennamen? Wo kannst Du kein Wörterbuch einsetzen?
horstel_horst
User
Beiträge: 18
Registriert: Montag 27. September 2021, 19:09

Ich "brauche" die nicht. Für mich waren die nur Mittel zum Zweck. Ich dachte, damit komme ich zum.
einfachTobi
User
Beiträge: 492
Registriert: Mittwoch 13. November 2019, 08:38

Das klingt erstmal so, als gäbe es keine Notwenigkeit DataFrames zu kopieren bzw. neue zu erstellen, sondern als müsse einfach nur mit dem bestehenden DataFrame gearbeitet werden.
Kannst du etwas mehr Infos geben? Also: Beispiel Input (Dataframe mit den ersten paar Zeilen; idealerweise als Code, damit man direkt mit den Daten hantieren kann), Beispiel des erwarteten Outputs (Welche Werte sollen wo hin?) und den bisherigen Code.
einfachTobi
User
Beiträge: 492
Registriert: Mittwoch 13. November 2019, 08:38

Skizze anhand meiner Vermutung:

Code: Alles auswählen

import pandas as pd
df = pd.DataFrame({"spalte_1": [1,2,3,4,5], "spalte2": ["dies", "das", "jenes", "welches", "den"], "filterspalte":["a", "b", "c", "d", "e"]})
filter_strings = ["a", "b", "e"]
with pd.ExcelWriter("c:/temp/foobar.xlsx", mode="w") as writer:
    for filter in filter_strings:
        df[df.filterspalte == filter].to_excel(writer, sheet_name=filter)
horstel_horst
User
Beiträge: 18
Registriert: Montag 27. September 2021, 19:09

Tobi, besten Dank!
Antworten