Gemischte Daten in Dataframe mit Mittelwert, Median, Standardabweichung, Min, Max an Excel

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
Gundula
User
Beiträge: 3
Registriert: Mittwoch 21. Oktober 2020, 05:25

HAllo,
ich komme nicht so ganz weiter, ich hoffe du hast eine tolle Idee dazu!
Ausgandtabelle in Excel (Aussehen):
Name Alter Gewicht
Max 32 87,3
Xaver 45 92,4
Michaela 45 63,5
Jürgen 55 58,6

habe ich eingelesen mit:
import pandas as pd
import numpy as np
df = pd.read_excel('C:\Python_Testing\Deskriptiv_01.xlsx', sheet_name='Uebersicht' , header=0 ,
df['Alter'] = df['Alter'].astype(float)
dt = df.dtypes
print (dt)

will ich wieder in die Ursprungstabelle in Excel einspielen in der Mappe Deskriptiv (noch nicht vorhanden) mit folgenden Aussehen:
mean median stab Min Max
Alter 44,3 45,0 8,2 32,0 55,0
Gewicht 75,5 63,5 14,6 58,6 92,4
...Name als object soll automatisch entfallen (stab ist Standardabweichung)

Ich habe viel probiert und hänge fest, kannst du mir helfen, ich bin gespannt :geek: :ugeek: ??
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Was hast du probiert? Zeige uns deinen Code.
Ansonsten: Numpy wird importiert, aber nicht verwendet. Die korrekte Abkürzung wäre `std`, da du ja bei `mean` auch den englischen Ausdruck verwendest.
https://pandas.pydata.org/pandas-docs/s ... .mean.html
https://pandas.pydata.org/pandas-docs/s ... edian.html
https://pandas.pydata.org/pandas-docs/s ... e.std.html
https://pandas.pydata.org/pandas-docs/s ... e.min.html
https://pandas.pydata.org/pandas-docs/s ... e.max.html
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wobei Excel bekanntlich auch rechnen kann und diverse Formeln kennt. Wenn das Ergebnis wieder in der selben Excel-Datei landet, würde ich ja eher Pandas weglassen und bei Excel bleiben. Zumindest solange da nur Funktionsrückgaben als Tabelle dargestellt werden.
Gundula
User
Beiträge: 3
Registriert: Mittwoch 21. Oktober 2020, 05:25

snafu hat geschrieben: Mittwoch 21. Oktober 2020, 16:01 Wobei Excel bekanntlich auch rechnen kann und diverse Formeln kennt. Wenn das Ergebnis wieder in der selben Excel-Datei landet, würde ich ja eher Pandas weglassen und bei Excel bleiben. Zumindest solange da nur Funktionsrückgaben als Tabelle dargestellt werden.
Da hast du natürlich Recht, das ist mir bewusst! In Excel nutze ich dass als Vorlagen für Powerpoints etc., ich rechne natürlich weiter damit in Python. Im Beispiel habe ich das ja auch tatsächlich mit Excel "berechnet! :P
Gundula
User
Beiträge: 3
Registriert: Mittwoch 21. Oktober 2020, 05:25

einfachTobi hat geschrieben: Mittwoch 21. Oktober 2020, 15:20 Was hast du probiert? Zeige uns deinen Code.
Ansonsten: Numpy wird importiert, aber nicht verwendet. Die korrekte Abkürzung wäre `std`, da du ja bei `mean` auch den englischen Ausdruck verwendest.
https://pandas.pydata.org/pandas-docs/s ... .mean.html
https://pandas.pydata.org/pandas-docs/s ... edian.html
https://pandas.pydata.org/pandas-docs/s ... e.std.html
https://pandas.pydata.org/pandas-docs/s ... e.min.html
https://pandas.pydata.org/pandas-docs/s ... e.max.html
Hallo,
ich bin inzwischen weitergekommen mean, median, std, min , max konnte ich als dataframe zu Excel exportieren:

import pandas as pd
import numpy as np
from scipy import stats as stats

import array
from array import *
df = pd.read_excel('C:\Python_Testing\Deskriptiv_01.xlsx', sheet_name='Uebersicht' , header=0 ,
encoding_override = "utf-8")
dt = df.dtypes
df['Alter'] = df['Alter'].astype(float) #Variable in float umwandeln
print("Variablen nach Datentypen:\n" , dt) #Erg: Prima, Alter wurde von int zu floa
df['Alter'] = df['Alter'].astype(float) #Variable in float umwandeln
df = df.drop(columns=["Name"]) # Dataframe mit nur float Variablen; ([""] löschen)

mean = round (df.mean() , 1)
median = round (df.median() , 2)
std = round (df.std() , 2)
min = df.min()
max = df.max()
mod = stats.mode(df)

print("Mittelwert: \n" , print , mean , "\n" , "Median: \n" , print , median , "\n" ,
"Standardabweichung:\n" , print , std , "\n" , "Minimum \n", print , min , "\n" ,
"Maximum \n" , print , max , "\n" , "Modalwert \n" , print , mod )

df20 = pd.DataFrame({"mean":mean , "median":median , "std":std , "min":min , "max":max})
print (print , "df20:\n" , print , df20)

with pd.ExcelWriter('C:\Python_Testing\Deskriptiv_20.xlsx') as exwriter:
df20.to_excel(exwriter, sheet_name='Deskriptiv_01')

Dies führt wie gewünscht in excel zu:
mean median std min max
Alter 44,2 45 9,43 32 55
Gewicht 75,4 75,4 16,88 58,6 92,4

Jetzt will ich hier rechts eigentlich noch den Modalwert anhängen (df20)
dies führt in der rechtesten spalte in Excel (rechts neben max zu:
Modalw
[[45. 58.6]]
[[2 1]]
Inhaltlich bedeutet das (soll bedeuten) das
Modalw Anz_Mod
Alter 45 2
Gewicht 58,6 1

Ich interpretiere [[45. 58.6]] [[2 1]] soll wohl ein array sein, bestehend aus 2 Tupeln. Ich möchte diese 2 Tupel an das Dataframe df20 wie gewüncht als Spalten rechts anhängen.
Wie kann ich das machen??
Danke euch!!!
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Gundula: Das importierte `array`-Modul wird überhaupt nicht verwendet, genau so wenig wie alles was aus diesem Modul dann per *-Import ins Modul geholt wird. So ein Sternchen-Import ist sowieso keine gute Idee weil das unkontrolliert den Namensraum vollmüllt und zu Problemen führen kann.

Numpy wird auch nirgends verwendet. Und beim Import von `scipy.stats` wird das `stats`-Modul in `stats` ”umbenannt”, also eben nicht umbenannt. Da macht ``as`` also überhaupt keinen Sinn.

Es ist unüblich in Python Quelltext an irgendwelchen Punktiationszeichen über Zeilen hinwen auszurichten. Das macht unnötig Arbeit und kann leicht dazu führen, dass man bei Änderungen an einer Zeile plötzlich auch noch andere Zeilen aus rein optischen Gründen anpassen muss, obwohl sich inhaltlich überhaupt nichts geändert hat. Siehe auch den Style Guide for Python Code.

Rückwärts gerichtete Schrägstriche (\) haben in Zeichenkettenliteralen eine besondere Bedeutung. Wenn sie die nicht haben sollen, dann muss man ein ”rohes” Zeichenkettenliteral verwenden. Du hast da Glück, das die Dateinamen zufällig so funktionieren.

Das Basisverzeichnis steht zweimal im Code, das sollte man in eine Konstante heraus ziehen.

Bei `read_excel()` werden zwei Schlüsselwortargumente übergeben die als Wert den Defaultwert haben.

Warum wandelst Du das Alter in Gleitkommazahlen um? Falls man so etwas tatsächlich braucht, würde man das besser gleich beim Einlesen machen. Und auch dort gleich angeben welche Spalten verwendet werden sollen.

Du gibst die `print()`-Funktion dauern als *Argument* an die `print()`-Funktion was total sinnlose Ausgaben zur Folge hat‽

Bei der Ausgabe der einzelnen berechneten Werte sind viele Leerzeichen vor einem Zeilenende die kein Mensch *sieht*, die also auch keinen Sinn machen.

Es wird ein `ExcelWriter`-Objekt erstellt, das nicht benötigt wird.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path

import pandas as pd
from scipy import stats

BASE_PATH = Path(R"C:\Python_Testing")


def main():
    data = pd.read_excel(
        BASE_PATH / "Deskriptiv_01.xlsx",
        sheet_name="Uebersicht",
        usecols=["Alter", "Gewicht"],
    )
    mean = round(data.mean(), 1)
    median = round(data.median(), 2)
    std = round(data.std(), 2)
    min = data.min()
    max = data.max()
    mod = stats.mode(data)
    print(
        f"Mittelwert:\n"
        f"{mean}\n"
        f"Median:\n"
        f"{median}\n"
        f"Standardabweichung:\n"
        f"{std}\n",
        f"Minimum\n"
        f"{min}\n"
        f"Maximum\n"
        f"{max}\n"
        f"Modalwert\n"
        f"{mod}\n",
    )
    result = pd.DataFrame(
        {"mean": mean, "median": median, "std": std, "min": min, "max": max}
    )
    print("result:\n", result)
    result.to_excel(
        BASE_PATH / "Deskriptiv_20.xlsx", sheet_name="Deskriptiv_01"
    )


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten