Konstruieren Sie Pandas DataFrame aus der Liste der Tupel von (Zeile, Spalte, Werte)

81

Ich habe eine Liste von Tupeln wie

data = [
('r1', 'c1', avg11, stdev11),
('r1', 'c2', avg12, stdev12),
('r2', 'c1', avg21, stdev21),
('r2', 'c2', avg22, stdev22)
]

und ich möchte sie in einen Pandas DataFrame mit Zeilen, die durch die erste Spalte benannt sind, und Spalten, die durch die zweite Spalte benannt sind, einfügen. Die Art und Weise, wie die Zeilennamen gepflegt werden, scheint ungefähr so ​​zu sein, pandas.DataFrame([x[1:] for x in data], index = [x[0] for x in data])aber wie kümmere ich mich um die Spalten, um eine 2x2-Matrix zu erhalten (die Ausgabe des vorherigen Satzes ist 3x4)? Gibt es eine intelligentere Möglichkeit, sich auch um Zeilenbeschriftungen zu kümmern, anstatt sie explizit wegzulassen?

EDIT Es scheint , dass ich zwei Datenrahmen benötigt - eine für Mittelwerte und eine für Standardabweichungen, ist das richtig? Oder kann ich in jeder "Zelle" eine Werteliste speichern?

gt6989b
quelle
1
Definitives Duplikat von < stackoverflow.com/questions/11415701/… >
ely
2
@EMS überhaupt nicht. Ich sah diese Frage, er brauchte das 2D-Schwenken nicht.
GT6989b
Ich bin anderer Meinung - ich denke, Sie kennen die richtige Methode zum Stapeln von Daten in einem DataFrame einfach nicht. Im Allgemeinen möchten Sie die Informationen sowohl in Spalte 1 als auch in Spalte 2 als Indizes verwenden, damit Sie schnell nach Daten suchen können. Die Dinge in Spalte 2 gehören nicht als Spaltennamen, aber selbst wenn dies der Fall ist, ist dies eine völlig andere Frage als der Titel Ihres Beitrags. Ich nehme an, das Bearbeiten des Titels könnte helfen (obwohl ich immer noch denke, dass es keine sinnvoll andere Frage ist).
Ely
1
@ely, gt6989b Ich habe dieses "... aus der Liste der Tupel von (Zeile, Spalte, Werte)" umbenannt, um zu verdeutlichen, warum dies kein Duplikat von "... aus Tupeln" ist
smci

Antworten:

65

Sie können Ihren DataFrame nach dem Erstellen schwenken:

>>> df = pd.DataFrame(data)
>>> df.pivot(index=0, columns=1, values=2)
# avg DataFrame
1      c1     c2
0               
r1  avg11  avg12
r2  avg21  avg22
>>> df.pivot(index=0, columns=1, values=3)
# stdev DataFrame
1        c1       c2
0                   
r1  stdev11  stdev12
r2  stdev21  stdev22
Roman Pekar
quelle
3
Die Zeile mit Index 0und Spalte mit Namen 1sind nicht sehr schön ...
Drevicko
49

Ich gehe davon aus, dass es besser ist, Ihre Daten so zu belassen, wie sie sind:

df = pandas.DataFrame(data, columns=['R_Number', 'C_Number', 'Avg', 'Std'])

# Possibly also this if these can always be the indexes:
# df = df.set_index(['R_Number', 'C_Number'])

Dann ist es etwas intuitiver zu sagen

df.set_index(['R_Number', 'C_Number']).Avg.unstack(level=1)

Auf diese Weise ist es implizit so, dass Sie versuchen, die Durchschnittswerte oder Standardabweichungen neu zu formen. Während es nur verwendet wird pivot, basiert es ausschließlich auf der Spaltenkonvention, welche semantische Entität Sie umformen.

ely
quelle
1
+1, nützliche Aussage. Ich interessiere mich ausdrücklich für eine 2D-Tabelle, damit ich nach Werten suchen kann, die sowohl durch Zeilen- als auch durch Spaltenlisten indiziert sind, und auf jede der Dimensionen separat zugreifen kann. Können Sie das mit gestapelten Daten tun?
GT6989b
2
Ja. Viel besser mit gestapelten Daten. Stellen Sie sich eine relationale Datenbanktabelle wie in SQL vor. Sie blasen nicht eine ganze Spalte in eine Reihe von wiederholten Spalten aus, oder? Das sollte nur in besonderen Fällen passieren (ich denke, es ist das große bis breite Muster). Normalerweise behandeln Sie mehrere Spalten als Indizes und treffen eine Auswahl, indem Sie eine der Indexspalten teilweise binden oder alle binden, um einen bestimmten Datensatz zu erhalten.
Ely
2
In Ihrem Fall können [R_Number, C_Number]Sie dies df.ix[('r1','c2')]beispielsweise nach dem Festlegen des Index tun . Oder Sie können beide als reguläre Spalten df[(df.R_Number == 'r1') & (df.C_Number == 'c2')]
belassen
2
Im Allgemeinen besteht der Hauptanwendungsfall für das, was Sie tun pivotmöchten, darin, eine Tabelle so zu formatieren, dass sie gut auf dem Bildschirm gedruckt oder gut in HTML, LaTeX oder .csv oder etwas anderes exportiert wird. Wie das Formatieren einer Tabelle, die in eine Präsentation oder Artikeleinreichung aufgenommen wird. Andernfalls möchten Sie, um Daten effizient zu bearbeiten, dass es sich um Multi-Indizes handelt, wenn Sie können (wie Schlüssel zu einer Datenbanktabelle) oder zumindest um wiederholte Spalten, damit Sie effizient indizieren und verknüpfen können usw. wollen sie in ihre eigenen Spalten blasen.
ely
35

Folgendes habe ich erwartet, als ich zu dieser Frage kam:

#!/usr/bin/env python

import pandas as pd


df = pd.DataFrame([(1, 2, 3, 4),
                   (5, 6, 7, 8),
                   (9, 0, 1, 2),
                   (3, 4, 5, 6)],
                  columns=list('abcd'),
                  index=['India', 'France', 'England', 'Germany'])
print(df)

gibt

         a  b  c  d
India    1  2  3  4
France   5  6  7  8
England  9  0  1  2
Germany  3  4  5  6
Martin Thoma
quelle
Sie haben die Frage falsch verstanden. Die ursprünglich in der Frage angegebenen Daten haben bereits Zeilen- und Spaltenbezeichnungen für jeden betreffenden Datensatz.
gt6989b
11
@ gt6989b Nein, habe ich nicht. Ich habe nicht versucht, die ursprüngliche Frage zu beantworten, sondern die Frage, die die Leute (möglicherweise) haben, wenn sie auf diese Seite kommen.
Martin Thoma
8
@ MartinThoma Danke, genau das suche ich auf dieser Seite.
ssword