Duplikate aus Spalte A entfernen und die richtigen Werte aus Spalte B finden und schreiben

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
isiii86
User
Beiträge: 3
Registriert: Freitag 13. Oktober 2017, 11:36

Hallo liebe Python-Freunde,

ich habe mit dem Programmieren neu angefangen, weil ich sehr gerne eine Computersprache erlernen wollte und bin bei Python hängen geblieben :)
Ich habe mir selber eine Aufgabe gestellt, die ich allerdings nicht ganz lösen kann. Ich denke, ich habe viel erreicht (Für einen Anfänger natürlich) brauche allerdings jetzt echt ein wenig Hilfe, da ich seit tagen probiere. Ich hoffe ihr könnt mir ein wenig helfen

Es geht um folgende Aufgabenstellung.
Gegeben sei ein excel-sehet mit zwei Spalten A, B

A B
01.10 0.5
01.10 0.4
02.10 0.3
02.10 0.3
03.10 0.2
01.10 0.1

Ziel

01.10 0.5 0.4 0.1
02.10 0.3 0.3
03.10 0.2


Wie weit ich gekommen bin:
Ich habe eine leere Liste erstellt, in der ich erstmal die Doppelten Datumswerte eliminiere und einfach darstellen lasse.
Anschließend habe ich das erste Element dieser neuen Liste genommen mit Spalte A verglichen. Ist der vergleich pos gib mir das zugehörige Element aus Spalte C

hier der Code

Code: Alles auswählen

mport pandas as pd
import numpy as np
import matplotlib.pyplot as plt

daten=pd.read_excel("data.xlsx", index=False)
daten.head()
new_date=[]
corrected_list=[]
field_test_data=pd.read_excel("Field Test Data.xlsx", sheetname="DATA prepaired for hist")
field_test_data.head()

x=daten["Date"].dt.strftime("%d.%m.%y")
y=daten["Accuracy"]

for i in x:
    if i in new_date:
        pass
    else:
        new_date=new_date+[i]


            

w=len(new_date)
for i in range(w):
    for j in range(44):
        if new_date[i]==x[j]:
            if not new_date[i] in corrected_list:
                corrected_list=corrected_list + [new_date[i]]+[y[j]]
            else:
                corrected_list=corrected_list+ [y[j]]

print(corrected_list)
Meine Lösung sieht fast so aus wie ich es will, nämlich
01.10
0.5
0.4
0.1
02.10
0.3
0.3

Ich weiß echt nicht was ich machen soll um die Ergebnisse so darstellen zu lassen wie ich es oben beschrieben habe

Könnt ihr mir da paar Tipps geben :)
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@isiii86: Listen haben eine append-Methode. `a = a + ` bedeutet, erst eine Liste mit einem Element b erzeugen. Dann eine neue Liste erzeugen, alle Elemente von a und b hineinkopieren. Das ist deutlich aufwändiger, als einfach nur ein Element anzuhängen. `i` und `x` sind schlechte Namen für ein bzw. mehrere Datums. Zeile 25: über den Index einer Liste zu iterieren ist ein Anti-Pattern, weil man genausogut über die Elemente direkt iterieren könnte. Zeile 26: woher kommt der magische Wert 44? Das Problem mit quadratische Laufzeit zu lösen ist umständlich, da es auch in linearer geht.

Dazu benutzt man einfach ein Wörterbuch:

Code: Alles auswählen

from collections import defaultdict
import pandas as pd

daten = pd.read_excel("data.xlsx", index=False)

all_dates = defaultdict(list)
for row in daten:
    all_dates[row["Date"]].append(row["Accuracy"])

for date, accuracies in sorted(all_dates.items()):
    print "{}: {}".format(date, accuracies)
isiii86
User
Beiträge: 3
Registriert: Freitag 13. Oktober 2017, 11:36

Hallo Sirius,

vielen lieben Dank für die schnelle Antwort.
Die Zahl 44 stellt die Menge der Elemente aus der Accuracy Spalte :). Ich muss zugeben, dass ich ein wenig Schwierigkeiten habe, deine Lösung nachzuvollziehen. Gibt es denn die Alternative über Schleifen das Problem Anfänger-freundlicher darstellen zu können.
Ich weiß genau, dass meine Idee nicht die eleganteste ist, aber wie sagt man schön: Übung macht den Meister. Ich würde sehr gerne über Loops das Problem gerne lösen :wink:



Besten Dank nochmal für deine Hilfe
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@isiii86: Wörterbücher sind eine wichtige Datenstruktur, die man nicht früh genug lernen und einsetzen sollte. Das defaultdict könnte man auch umständlich selbst implementieren:

Code: Alles auswählen

all_dates = {}
for row in daten:
    if row["Date"] not in all_dates:
        all_dates[row["Date"]] = []
    all_dates[row["Date"]].append(row["Accuracy"])
isiii86
User
Beiträge: 3
Registriert: Freitag 13. Oktober 2017, 11:36

Vielen lieben Dank. Hab es endlich verstanden :)
Mit der defaultdict-Hilfe besteht das Ganze Programm aus zwei Zeilen.
Hast mir echt weiterhelfen können :) :) :)
Antworten