Dataframe im Loop
-
- 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?
- __blackjack__
- User
- Beiträge: 13928
- 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?
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
-
- User
- Beiträge: 18
- Registriert: Montag 27. September 2021, 19:09
Sorry, hier ein kleines Beispiel:
Anstelle einen Dataframe mit dem Namen "df", hätte ich gerne zwei Dataframes: "temp_a" & "temp_b"
Ist das verständlicher?
Code: Alles auswählen
d = [1]
for i in ('a','b'):
a = 'temp_'
b = str(i)
name = a + b
df = pd.DataFrame(d)
Ist das verständlicher?
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.
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.
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.
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)
-
- 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:
Meine Frage:
1. Wie füge ich die Elemente der Liste 'a' und 'b' an 'df_' an?
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]
1. Wie füge ich die Elemente der Liste 'a' und 'b' an 'df_' an?
Die Antwort beleibt die gleiche: so was macht man nicht, und die Lösung ist auch die selbe:
Wobei dieser Code ganz einfach durch groupby zu ersetzen ist:
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'])
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'))
-
- 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?
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?
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.
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.
-
- 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.
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.
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.
-
- User
- Beiträge: 510
- 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.
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.
-
- 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.
-
- 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.
-
- User
- Beiträge: 510
- 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.
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.
-
- User
- Beiträge: 510
- 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)
-
- User
- Beiträge: 18
- Registriert: Montag 27. September 2021, 19:09
Tobi, besten Dank!