Seite 1 von 1
Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 16:18
von PyN
Hallo zusammen
wäre jemand so lieb zu Helfen / einen Denkanstoss für folgendes Problem geben:
Ausgangstabelle besteht aus drei Spalten mit n - Zeilen.
Spalte 1=Datum (gleiches Datum kann öfters vorkommen)
Spalte 2: Identifier (gleicher Identifier kann häufiger vorkommen)
Spalte 3: zugehöriger Wert
Zieltabelle:
N Zeilen mit Inhalt zugehöriger Wert bei Match sonst 0
N Spalten mit erster Spalte Datum und dann Identifier als Überschrift
Bei der Zieltabelle soll jedes Datum nur einmal vorkommen.
Denkt ihr das ist möglich ?
Ich hoffe es war verständlich erklärt.
Schonmal besten Danke für jede Anregung

Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 16:31
von __deets__
Ich verstehe das nicht. Was ist der "zugehoeriger match"? Und was sind die N? Und was sollen N Spalten sein, die dann wiederum eine Spalte haben? Kannst du mal ein Beispiel aus Daten und dann dazugehoerigem Ergebnis machen?
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 16:39
von PyN
na klar.
Meine Ausgangstabelle:
Datum | Identifier | Wert
20.11 | ID 1 | 2,1
19.11 | ID1 | 1,3
20.11 | ID2 | 0,5
Zieltabelle:
Datum | ID 1 | ID 2
20.11 | 2,1 | 0,5
19.11 | 1,3 | -
Wobei die Werte nicht aggregiert werden dürfen...
Danke schonmal für deine schnelle Antwort.
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 16:41
von __deets__
Du willst also fuer jedes Datum aus jeder ID eine Spalte machen, und deren Werte dann eintragen. Was passiert, wenn am gleichen Tag mehrfach die gleiche ID vorkommt? Sollen die Werte dann verbunden werden?
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 16:44
von PyN
am gleichen Tag kann eine ID nur einmal vorkommen
für jedes Datum soll es eine Zeile geben und für jede ID eine Spalte
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 17:04
von __deets__
Na dann: ueber die mit einem Reader aus dem csv-Modul eingelesenen Zeilen iterieren, und in einem Woerterbuch (dict) fuer jedes Datum wieder ein Woerterbuch anlegen. Kann man elegant zB mit collections.defaultdict machen. Dann den Wert fuer aktuelles Datum und ID eintragen. Gleichzeitig eine Menge (set) von allen IDs mit der aktuellen ID fuettern. Damit hat man dann alles eingelesen.
Zum schreiben ueber die Schluessel/Werte des Woerterbuches iterieren. Schluessel ist ja ein Datum, das als ersten Wert in eine neue Liste eintragen. Dann ueber die Menge der IDs iterieren, und wenn dafuer ein Wert im aktuellen Wert ist (das ist ja wiederum das Woerterbuch ID->Werte), dann die Werte an die Liste anhaengen. Sonst einen leeren Wert anhaengen, damit die Spalten passen.
Danach die Liste fuer eine Zeile mit einem csv-Writer wegschreiben.
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 17:08
von PyN
vielen Dank !
Ich werde mich gleich mal ausprobieren
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 17:41
von pillmuncher
Hier mal die zentrale Logik, ohne Ein- und Ausgabe mittels csv:
Code: Alles auswählen
data = [
['20.11', 'ID1', 2.1],
['19.11', 'ID1', 1.3],
['20.11', 'ID2', 0.5],
]
transposed = list(zip(*data))
ids = sorted(set(transposed[1]))
dates = sorted(set(transposed[0]))
tmp = {}
for date, id, value in data:
tmp[date, id] = value
print('Datum', end = ' | ')
for id in ids:
print(id, end=' | ')
print()
for date in dates:
print(date, end=' | ')
for id in ids:
print(tmp.get((date, id), ' - '), end=' | ')
print()
Ergebnis:
Code: Alles auswählen
Datum | ID1 | ID2 |
19.11 | 1.3 | - |
20.11 | 2.1 | 0.5 |
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 18:35
von Sirius3
@pillmuncher: das mit den zwei Wörterbüchern ist deutlich einfacher, weil man nur einmal über die Daten iterieren muß.
Code: Alles auswählen
data = [
['20.11', 'ID1', 2.1],
['19.11', 'ID1', 1.3],
['20.11', 'ID2', 0.5],
]
ids = set()
matrix = defaultdict(dict)
for date, id, value in data:
ids.add(id)
matrix[date][id] = value
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 18:48
von PyN
Danke für eure Hilfe. Habe es leider aber trotzdem noch nicht ans Ziel geschafft....
Urpsrungsformat ist ein Dataframe mit Spalten: date, ID, Wert
Da ich mich in Python noch kaum auskenne habe ich den vorherigen Code probiert anzupassen:
Liste=df.values.tolist()
transposed = list(zip(*Liste))
ids = sorted(set(transposed[1]))
dates = sorted(set(transposed[0]))
tmp = {}
for date, id, value in Liste:
tmp[date, id] = value
for date in dates:
for id in ids:
(tmp.get((date, id)))
x=pd.DataFrame.from_dict(tmp, orient="index")
Zielformat sollte wieder eine CSV Datei werden
wäre echt lieb, wenn ihr mir nochmal helfen könntet

Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 18:57
von Sirius3
@PyN: das hättest Du auch gleich verraten können, dass Du pandas benutzen willst.
Dann mußt Du erst ein passendes Dataframe erzeugen, das Du dann füllen kannst:
Code: Alles auswählen
data = [
['20.11', 'ID1', 2.1],
['19.11', 'ID1', 1.3],
['20.11', 'ID2', 0.5],
]
df = pandas.DataFrame(data, columns=['date','id','value'])
matrix = pandas.DataFrame(index=df['date'].unique(), columns=df['id'].unique())
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 19:15
von PyN
Wollen schon nur können noch nicht

Habe heute mit pandas angefangen...
df = pandas.DataFrame(data, columns=['date','id','value'])
matrix = pandas.DataFrame(index=df['date'].unique(), columns=df['id'].unique())
matrix.to_csv(r"C:\...xy.csv")
Damit steht das "Grundgerüst" perfekt!
Kannst du mir noch sagen, wie ich die Werte einfügen kann in die Zeilen? Im Moment sind noch alle Zeilen bis auf die Beschriftungen leer...
Bin dir echt richtig dankbar.
Re: Tabelle bearbeiten
Verfasst: Donnerstag 12. Dezember 2019, 19:46
von Sirius3
Am einfachsten mit einer Schleife füllen.
Code: Alles auswählen
for row in df.itertuples():
matrix.loc[row.date, row.id] = row.value
Gibt bestimmt in Pandas noch was besseres, aber finde gerade nichts.