Seite 1 von 1
Dataframe im Loop
Verfasst: Mittwoch 10. November 2021, 17:45
von horstel_horst
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?
Re: Dataframe im Loop
Verfasst: Mittwoch 10. November 2021, 18:00
von __blackjack__
@horstel_horst: Die Frage ist nicht wirklich eindeutig. Was ist „der Name des Eintrags“ und was bedeutet es, den dem Dataframe hinzuzufügen?
Re: Dataframe im Loop
Verfasst: Mittwoch 10. November 2021, 18:00
von Sirius3
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?
Re: Dataframe im Loop
Verfasst: Mittwoch 10. November 2021, 18:06
von horstel_horst
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?
Re: Dataframe im Loop
Verfasst: Mittwoch 10. November 2021, 18:16
von sparrow
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.
Re: Dataframe im Loop
Verfasst: Mittwoch 10. November 2021, 19:22
von Sirius3
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)
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 11:26
von horstel_horst
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?
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 12:13
von Sirius3
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'))
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 12:59
von horstel_horst
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?
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 13:15
von __deets__
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.
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 15:00
von horstel_horst
Sorry, aber damit kann ich immer noch keinen neue Dataframes mit den Namen df_a und df_b erzeugen.
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 15:24
von sparrow
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.
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 15:31
von einfachTobi
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.
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 16:12
von horstel_horst
Ich möchte die gefilterten Dataframes in jeweils separate Excel-Tabellenblätter schreiben. Dabei soll der Name des Tabellenblatts den der 'member' haben.
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 16:15
von Sirius3
Und an welcher Stelle brauchst Du dann dynamisch generierte Variablennamen? Wo kannst Du kein Wörterbuch einsetzen?
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 16:19
von horstel_horst
Ich "brauche" die nicht. Für mich waren die nur Mittel zum Zweck. Ich dachte, damit komme ich zum.
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 16:20
von einfachTobi
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.
Re: Dataframe im Loop
Verfasst: Donnerstag 11. November 2021, 16:32
von einfachTobi
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)
Re: Dataframe im Loop
Verfasst: Donnerstag 18. November 2021, 09:55
von horstel_horst
Tobi, besten Dank!