Liste von Dataframes

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Mittels eines for-loops erzeuge ich dataframes, diese Folgen einern Namenkonvention: df_1, df_2 etc.

Diese möchte ich nun mit zusammenführen:

Code: Alles auswählen

frames = [df_1,df_2]
dfs = pd.concat(frames, axis = 1).reset_index()

Funktioniert soweit. 

Nun möchte ich aber den Inhalt von 'frames' mit Hilfe einer vorhanden Liste erstellen:

[code]
liste = [1,2]
Hier komme ich nicht weiter. Wie kann ich das Problem lösen?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

An der Stelle im Code, an der Du `df_1` erzeugst, mußt Du diese einfach in einen sinnvollen Variablennamen umbenennen, der auch etwas über den Inhalt aussagt, und diesen an frames per append anhängen.
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Ich habe das Gefühl, dass mein Vorgehen nicht optimal ist. So erzeuge ich die DFs:

Code: Alles auswählen


liste = [1,2]
for elem in liste:
    var = 'col_' + str(elem)
    globals()["df_" + str(elem)] = pd.DataFrame(df.groupby('year')[var].mean())

Als Resultat habe ich nun df_1 und df_2. Ist das Vorgehen so überhaupt "richtig"?

Die beiden DFs df_1 und df_2 sollen, wie o.a., in einem DF zusammengeführt werden.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@st_baum: Nein, dynamisch globale Variablen erstellen ist falsch. Warum erzeugst Du nicht dort gleich eine Liste mit den DataFrame-Objekten? Oder ein Wörterbuch denn `liste` wird ja nicht einfach nur von 1 aufsteigende Zahlen enthalten, sonst wäre das ein bisschen überflüssig da eine Liste für anzulegen. `liste`, `elem`, und `var` sind hier auch keine guten Namen.

Wenn man die Definition von `var` direkt einsetzt, denn das wird ja nur einmal verwendet, dann steht in der Schleife nur noch ein Ausdruck und das kann, egal ob es nun eine Liste oder ein Wörterbuch sein soll, zu einer „comprehension“ werden.

Code: Alles auswählen

    data_frames = []
    for column_number in range(1, 3):
        data_frames.append(
            pd.DataFrame(df.groupby("year")[f"col_{column_number}"].mean())
        )
    
    # =>
    
    data_frames = [
        pd.DataFrame(df.groupby("year")[f"col_{column_number}"].mean())
        for column_number in range(1, 3)
    ]
Was jetzt noch nicht wirklich Sinn macht ist für jede Spalte erneut nach dem Jahr zu gruppieren. Und man muss auch nicht für jede Spalte einzeln den Mittelwert berechnen. Effizienter wäre es erst nur die notwendigen Spalten zu selektieren, die dann nach dem Jahr zu gruppieren, und für alle Spalten zusammen den Mittelwert zu berechnen. Dann fällt vielleicht auch der ganze Kram mit den Listen und dem zusammensetzen zu einem DataFrame weg. Also so etwas in dieser Richtung:

Code: Alles auswählen

    means_by_year = (
        df[["year", *(f"col_{number}" for number in range(1, 3))]]
        .groupby("year")
        .mean()
    )
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Der zweite Vorschlag war genau was ich wollte. Danke
snx23
User
Beiträge: 1
Registriert: Freitag 25. November 2022, 09:22

Hallo ich bin ganz neu hier und weiß nicht wie ich selber einen Beitrag erstellen kann, aber muss diese Übungen heute. abgeben. Kann mir jemand helfen :( WÄRE SEHR DANKBAR


# liste
1. Erstellen Sie eine Liste mit fünf Namen durch Benutzereingabe
2. Geben Sie diese Liste mit einer Schleife aus
3. Welche Klassenmethoden sind bei einer Liste verfügbar? Testen Sie diese
4. Schneiden Sie aus der Liste das 2 bis 4 Element aus


#tupel
###1.2.2 Tupel


1. Erzeugen Sie ein Tupel mit fünf Wörtern
2. Greifen Sie auf den vierten Eintrag zu und geben Sie diesen aus
3. Geben Sie einen Eintrag über den Index aus
4. Schneiden Sie aus dem Tupel die Daten von 1 bis 4
5 Mit welcher Methode kann überprüft werden, ob sich ein bestimmter Wert im Tupel befindet (Rückgabe true/false)?
6. Iterieren Sie über das Tupel und geben Sie Index und Daten aus
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Und was hast Du schon probiert? Wo kommst Du konkret nicht weiter?
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snx23: Die Listenaufgabe 3. ist ja gemein. Listen haben gar keine Klassenmethoden. Lass Dich da nicht auf's Glatteis führen. 🤓 (Obwohl: `__new__()` ist natürlich eine Klassenmethode, aber ob Listen die tatsächlich selber haben oder einfach von `object` erben wäre ja ein Implementierungsdetail.)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python3
from itertools import islice


def main():
    # list

    # 1.
    print("Please enter 5 names, ending each input with the enter key:")
    names = list(islice(iter(input, None), 5))

    # 2.
    print("🎀", names)

    # 3.
    # `list` hat keine Klassenmethoden.

    # 4.
    #
    # Die Frage ist unterspezifiziert weil nicht klar ist was a) die Zahlen
    # bedeuten sollen (Index oder Position wie sie die meisten Menschen zählen
    # würden?) und b) nicht wirklich klar ist was ”ausschneiden” bedeuten soll,
    # also was das Ergebnis sein soll — das ausgeschnittene oder das aus dem
    # Ausgeschnitten wurde?
    names = [names[0], names[4]]

    # tuple

    # 1.
    words = ("person", "woman", "man", "camera", "TV")

    # 2.
    words[-2]

    # 3.
    print(words[0])

    # 4.
    words = (words[0], words[4])

    # 5.
    words.__contains__("TV")  # -> True

    # 6.
    for index, word in enumerate(words):
        print(index, word)


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten