Mittelwert über bestimmten wert

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
janedoe
User
Beiträge: 1
Registriert: Freitag 21. Juli 2017, 20:58

Freitag 21. Juli 2017, 21:09

Hallo zusammen,
ich bin noch ziemlich neu im Umgang mit python und beim Googlen auf diese Seite gestoßen.

Bevor ich hier jetzt lange rum schreibe, komme ich gleich mal zur Frage und hoffe, dass mir einer von euch einen Tipp geben kann.
ich habe eine Datei, die folgendermaßen ansieht:

Code: Alles auswählen

Datum	phi	lam	T
20160101	48	16	-1
20160101	48,5	16,2	-0,4
20160101	49	16,4	-2,8
20160101	49,5	16,6	0
20160102	48	16	0,1
20160102	48,5	16,2	-0,9
20160102	49	16,4	-5
20160102	49,5	16,6	-1
20160106	48	16	-0,5
20160106	48,5	16,2	1
20160106	49	16,4	1,2
20160106	49,5	16,6	1,9
20160110	48	16	0,9
20160110	48,5	16,2	2,1
20160110	49	16,4	-0,1
20160110	49,5	16,6	0
20160114	48	16	-0,2
20160114	48,5	16,2	3
20160114	49	16,4	2,9
20160114	49,5	16,6	2,1
20160118	48	16	3,2
20160118	48,5	16,2	-0,4
20160118	49	16,4	-0,7
20160118	49,5	16,6	1
20160122	48	16	0
20160122	48,5	16,2	0,1
20160122	49	16,4	-0,2
20160122	49,5	16,6	-1,7
20160126	48	16	1,1
20160126	48,5	16,2	2
20160126	49	16,4	2,1
20160126	49,5	16,6	1,9
...
Die Datei setzt sich aus Datum, Ortskoord. und T-Wert zusammen. Jetzt möchte ich gerne die jeweiligen T-Werte mitteln. Also alle T-Wert bei phi=48 und lam = 16, von jedem Datum, dann die T-Werte bei phi=48,5 und lam = 16,2 usw. Hier komme ich leider nicht weiter. Brauche ich dazu unbedingt eine Schleife, oder kann man die Mittelung auch über die einzelnen Indixes durchführen? Bis jetzt habe ich nur den mean-Befehl verwendet, da konnte ich aber immer nur über die gesamte T-Spalte mitteln, ohne auf die Ortseingaben einzugehen. Leider weiß ich nicht so recht, wie ich das ganze sonst angehen soll.

LG. Jane
Benutzeravatar
pixewakb
User
Beiträge: 967
Registriert: Sonntag 24. April 2011, 19:43

Freitag 21. Juli 2017, 22:35

1. Datei öffnen und Daten einlesen
2. Über die Daten iterieren und dabei
3. ...die Werte in ein Wörterbuch (key=Koordinaten, value=Wert) packen
4. Anschließend über die keys des Wörterbuchs iterieren und die Mittelwerte berechnen und direkt printen

So würde ich das machen. (Wahrscheinlich geht es eleganter oder schneller, aber vielleicht antworten ja noch andere...)
Benutzeravatar
pixewakb
User
Beiträge: 967
Registriert: Sonntag 24. April 2011, 19:43

Freitag 21. Juli 2017, 22:47

Kommst Du damit weiter?

Code: Alles auswählen

import pprint

w = """Datum   phi   lam   T
20160101   48   16   -1
20160101   48,5   16,2   -0,4
20160101   49   16,4   -2,8
20160101   49,5   16,6   0
20160102   48   16   0,1
20160102   48,5   16,2   -0,9
20160102   49   16,4   -5
20160102   49,5   16,6   -1
20160106   48   16   -0,5
20160106   48,5   16,2   1
20160106   49   16,4   1,2
20160106   49,5   16,6   1,9
20160110   48   16   0,9
20160110   48,5   16,2   2,1
20160110   49   16,4   -0,1
20160110   49,5   16,6   0
20160114   48   16   -0,2
20160114   48,5   16,2   3
20160114   49   16,4   2,9
20160114   49,5   16,6   2,1
20160118   48   16   3,2
20160118   48,5   16,2   -0,4
20160118   49   16,4   -0,7
20160118   49,5   16,6   1
20160122   48   16   0
20160122   48,5   16,2   0,1
20160122   49   16,4   -0,2
20160122   49,5   16,6   -1,7
20160126   48   16   1,1
20160126   48,5   16,2   2
20160126   49   16,4   2,1
20160126   49,5   16,6   1,9"""

lines = w.split("\n")

wb = {}

for line in lines[1:]:      # 1

    datum, phi, lam, T = line.split("   ")
    T = float(T.replace(",","."))

    if not (phi, lam) in wb.keys():
        wb[(phi, lam)] = []
        
    wb[(phi, lam)].append(T)


# Kontrollausgabe
pprint.pprint(wb)


for key in wb.keys():
    mittelwert = sum(wb[key]) / len(wb[key])    # 2
    print("{}: {:5.2f}".format("-".join(key), mittelwert))
# 1 Die mache das an der Stelle, damit ich nicht auf den "Dateikopf" separat ausschließen muss. Wenn es Dir unterkommen kann, dass Dateien mal keinen Kopf mit Spaltenüberschriften besitzen, sollte man eine dynamische Prüfung integrieren.

# 2 Die Funktionen sum(liste) und len(liste) sind Funktionen, die auf Listen funktionieren. Die erste addiert alle Elemente einer Liste, die zweite bestimmt die Länge der Liste, also die Anzahl der Elemente. Ich finde das so zu machen einfacher als eine eigene Funktion zu importieren.

Last but not least: Bedenke, dass die keys eines Wörterbuchs nicht (!) sortiert sind, d. h. die Ausgabe ist nicht sortiert. Falls Du es sortiert brauchst, musst Du die Ausgabe noch mal angehen.
Benutzeravatar
pixewakb
User
Beiträge: 967
Registriert: Sonntag 24. April 2011, 19:43

Freitag 21. Juli 2017, 22:52

PS Falls Du aus dem wissenschaftlichen Bereich kommst und mit größeren Datenmengen zu tun hast, solltest Du dir mal pandas ansehen...
Sirius3
User
Beiträge: 7779
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 21. Juli 2017, 23:19

@pixewakb: man prüft direkt, ob ein Schlüssel in einem Wörterbuch ist und nicht über ›keys‹. Wenn man sowohl Schlüssel als auch Wert braucht, gibt es ›items‹. ›defaultdict‹ ist auch ganz nützlich:

Code: Alles auswählen

from collections import defaultdict
wb = defaultdict(list)
 
for line in lines[1:]:
    datum, phi, lam, T = line.split()
    T = float(T.replace(",", "."))
    wb[phi, lam].append(T)

for key, values in wb.items():
    mittelwert = sum(values) / len(values)
    print("{0[0]}-{0[1]}: {1:5.2f}".format(key, mittelwert))
Benutzeravatar
pixewakb
User
Beiträge: 967
Registriert: Sonntag 24. April 2011, 19:43

Freitag 21. Juli 2017, 23:22

Sirius3 hat geschrieben:@pixewakb: man prüft direkt, ob ein Schlüssel in einem Wörterbuch ist und nicht über ›keys‹.
<s>Kannst Du mal ein Codebeispiel nachliefern. So eine Prüfung muss ich nämlich bislang häufiger erledigen. Vielen Dank!</s>
Du meinst so:

Code: Alles auswählen

>>> wb = {}
>>> wb["a"] = 1
>>> "a" in wb
True
Danke! Ich habe was dazugelernt.
Antworten