Wie man eine pivot-dataframe
- Was ist pivot?
- Wie kann ich pivot?
- Ist das ein pivot?
- Lang-format wide format?
Ich habe gesehen, eine Menge Fragen, die Sie Fragen, über pivot-Tabellen. Auch wenn Sie nicht wissen, dass Sie Fragen über pivot-Tabellen, Sie sind in der Regel. Es ist praktisch unmöglich, zu schreiben, eine kanonische Frage und Antwort, umfasst alle Aspekte des schwenkens....
... Aber ich werde es zu gehen.
Das problem mit den bestehenden Fragen und Antworten ist, dass oft auf die Frage konzentriert sich auf die nuance, dass der OP Schwierigkeiten hat, zu verallgemeinern, um die Anzahl der vorhandenen guten Antworten. Jedoch, keiner der Antworten, die versuchen, eine umfassende Erklärung (weil es eine schwierige Aufgabe)
Schauen ein paar Beispiele aus meiner
- Wie man eine pivot-dataframe in Pandas?
- Gute Frage und die Antwort. Aber die Antwort, nur Antworten auf die spezifische Frage, die mit wenig Erklärung.
- pandas pivot-Tabelle Daten-frame
- In dieser Frage, der OP beschäftigt sich mit der Ausgabe der pivot. Nämlich, wie die Spalten Aussehen. OP wollte es zu schauen, wie R. Dies ist nicht sehr nützlich für pandas Benutzer.
- pandas schwenkbare einen dataframe, doppelte Zeilen
- Andere anständige Frage, aber die Antwort konzentriert sich auf eine Methode, nämlich
pd.DataFrame.pivot
- Andere anständige Frage, aber die Antwort konzentriert sich auf eine Methode, nämlich
Also, wenn jemand sucht für pivot
Sie bekommen sporadischen Ergebnisse sind wahrscheinlich nicht gehen, um eine Antwort auf Ihre spezifische Frage zu stellen.
Setup
Können Sie feststellen, dass ich deutlich mit dem Namen der Spalten und die entsprechenden Werte in der Spalte zu entsprechen, wie werde ich zu pivot in den Antworten unten. Achten Sie, so dass Sie vertraut mit, wo die Spaltennamen gehen, wo man die Ergebnisse, die Sie suchen.
import numpy as np
import pandas as pd
from numpy.core.defchararray import add
np.random.seed([3,1415])
n = 20
cols = np.array(['key', 'row', 'item', 'col'])
arr1 = (np.random.randint(5, size=(n, 4)) // [2, 1, 2, 1]).astype(str)
df = pd.DataFrame(
add(cols, arr1), columns=cols
).join(
pd.DataFrame(np.random.rand(n, 2).round(2)).add_prefix('val')
)
print(df)
key row item col val0 val1
0 key0 row3 item1 col3 0.81 0.04
1 key1 row2 item1 col2 0.44 0.07
2 key1 row0 item1 col0 0.77 0.01
3 key0 row4 item0 col2 0.15 0.59
4 key1 row0 item2 col1 0.81 0.64
5 key1 row2 item2 col4 0.13 0.88
6 key2 row4 item1 col3 0.88 0.39
7 key1 row4 item1 col1 0.10 0.07
8 key1 row0 item2 col4 0.65 0.02
9 key1 row2 item0 col2 0.35 0.61
10 key2 row0 item2 col1 0.40 0.85
11 key2 row4 item1 col2 0.64 0.25
12 key0 row2 item2 col3 0.50 0.44
13 key0 row4 item1 col4 0.24 0.46
14 key1 row3 item2 col3 0.28 0.11
15 key0 row3 item1 col1 0.31 0.23
16 key0 row0 item2 col3 0.86 0.01
17 key0 row4 item0 col3 0.64 0.21
18 key2 row2 item2 col0 0.13 0.45
19 key0 row2 item0 col4 0.37 0.70
Frage(N)
-
Warum bekomme ich
ValueError: Index contains duplicate entries, cannot reshape
-
Wie kann ich pivot -
df
so, dass diecol
Werte sind Spaltenrow
Werte sind die index -, und Mittelwert vonval0
sind die Werte?col col0 col1 col2 col3 col4 row row0 0.77 0.605 NaN 0.860 0.65 row2 0.13 NaN 0.395 0.500 0.25 row3 NaN 0.310 NaN 0.545 NaN row4 NaN 0.100 0.395 0.760 0.24
-
Wie kann ich pivot -
df
so, dass diecol
Werte sind Spaltenrow
Werte sind der index, Mittelwertval0
sind die Werte und fehlende Werte0
?col col0 col1 col2 col3 col4 row row0 0.77 0.605 0.000 0.860 0.65 row2 0.13 0.000 0.395 0.500 0.25 row3 0.00 0.310 0.000 0.545 0.00 row4 0.00 0.100 0.395 0.760 0.24
-
Bekomme ich etwas anderes als
mean
, wie vielleichtsum
?col col0 col1 col2 col3 col4 row row0 0.77 1.21 0.00 0.86 0.65 row2 0.13 0.00 0.79 0.50 0.50 row3 0.00 0.31 0.00 1.09 0.00 row4 0.00 0.10 0.79 1.52 0.24
-
Kann ich noch tun, dass eine aggregation zu einem Zeitpunkt?
sum mean col col0 col1 col2 col3 col4 col0 col1 col2 col3 col4 row row0 0.77 1.21 0.00 0.86 0.65 0.77 0.605 0.000 0.860 0.65 row2 0.13 0.00 0.79 0.50 0.50 0.13 0.000 0.395 0.500 0.25 row3 0.00 0.31 0.00 1.09 0.00 0.00 0.310 0.000 0.545 0.00 row4 0.00 0.10 0.79 1.52 0.24 0.00 0.100 0.395 0.760 0.24
-
Kann ich das Aggregat über mehrere Spalten?
val0 val1 col col0 col1 col2 col3 col4 col0 col1 col2 col3 col4 row row0 0.77 0.605 0.000 0.860 0.65 0.01 0.745 0.00 0.010 0.02 row2 0.13 0.000 0.395 0.500 0.25 0.45 0.000 0.34 0.440 0.79 row3 0.00 0.310 0.000 0.545 0.00 0.00 0.230 0.00 0.075 0.00 row4 0.00 0.100 0.395 0.760 0.24 0.00 0.070 0.42 0.300 0.46
-
Kann Unterteilen nach mehreren Spalten?
item item0 item1 item2 col col2 col3 col4 col0 col1 col2 col3 col4 col0 col1 col3 col4 row row0 0.00 0.00 0.00 0.77 0.00 0.00 0.00 0.00 0.00 0.605 0.86 0.65 row2 0.35 0.00 0.37 0.00 0.00 0.44 0.00 0.00 0.13 0.000 0.50 0.13 row3 0.00 0.00 0.00 0.00 0.31 0.00 0.81 0.00 0.00 0.000 0.28 0.00 row4 0.15 0.64 0.00 0.00 0.10 0.64 0.88 0.24 0.00 0.000 0.00 0.00
-
Oder
item item0 item1 item2 col col2 col3 col4 col0 col1 col2 col3 col4 col0 col1 col3 col4 key row key0 row0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.86 0.00 row2 0.00 0.00 0.37 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.50 0.00 row3 0.00 0.00 0.00 0.00 0.31 0.00 0.81 0.00 0.00 0.00 0.00 0.00 row4 0.15 0.64 0.00 0.00 0.00 0.00 0.00 0.24 0.00 0.00 0.00 0.00 key1 row0 0.00 0.00 0.00 0.77 0.00 0.00 0.00 0.00 0.00 0.81 0.00 0.65 row2 0.35 0.00 0.00 0.00 0.00 0.44 0.00 0.00 0.00 0.00 0.00 0.13 row3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.28 0.00 row4 0.00 0.00 0.00 0.00 0.10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 key2 row0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.40 0.00 0.00 row2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.13 0.00 0.00 0.00 row4 0.00 0.00 0.00 0.00 0.00 0.64 0.88 0.00 0.00 0.00 0.00 0.00
-
Kann ich insgesamt die Häufigkeit, in welcher die Spalten-und Zeilen gemeinsam auftreten, aka "kreuztabellierung"?
col col0 col1 col2 col3 col4 row row0 1 2 0 1 1 row2 1 0 2 1 2 row3 0 1 0 2 0 row4 0 1 2 2 1
InformationsquelleAutor piRSquared | 2017-11-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beginnen wir mit der Beantwortung der ersten Frage:
Frage 1
Dies geschieht, weil pandas versucht, neu indizieren entweder ein
columns
oderindex
Objekt mit doppelten Einträgen. Es gibt unterschiedliche Methoden verwenden, kann eine pivot. Einige von Ihnen sind nicht gut geeignet, wenn es Duplikate sind der Schlüssel, in dem er gebeten wird, PivotTabelle auf. Zum Beispiel. Betrachtenpd.DataFrame.pivot
. Ich weiß, es gibt doppelte Einträge, die dasrow
undcol
Werte:Also, wenn ich
pivot
mitBekomme ich den oben genannten Fehler. In der Tat, bekomme ich die gleiche Fehlermeldung, wenn ich versuche, um die gleiche Aufgabe mit:
Hier ist eine Liste von Redewendungen, die wir benutzen können, um pivot -
pd.DataFrame.groupby
+pd.DataFrame.unstack
unstack
die Ebenen, die Sie möchten, in der Spalte index.pd.DataFrame.pivot_table
groupby
mit mehr intuitive API. Für viele Menschen, dies ist der bevorzugte Ansatz. Und ist der vorgesehene Ansatz von den Entwicklern.pd.DataFrame.set_index
+pd.DataFrame.unstack
groupby
Paradigma, wir geben Sie alle Spalten, die irgendwann entweder Zeile oder Spalte und legen Sie diese auf den index. Wir haben dannunstack
die Ebenen wollen wir in den Spalten. Wenn entweder die übrigen index-Ebenen-oder Spaltenebene sind nicht eindeutig ist, wird diese Methode scheitern.pd.DataFrame.pivot
set_index
dass Sie Aktien der doppelte key-Einschränkung. Die API ist sehr beschränkt, wie gut. Es dauert nur Skalare Werte fürindex
,columns
,values
.pivot_table
Methode, die wir wählen, Zeilen, Spalten und Werte, auf die pivot. Aber wir können nicht aggregieren, und wenn Sie entweder auf Zeilen oder Spalten sind nicht eindeutig ist, wird diese Methode scheitern.pd.Kreuztabelle
pivot_table
und in seiner reinsten form ist die intuitive Art und Weise, um mehrere Aufgaben ausführen.pd.faktorisieren
+np.bincount
pd.get_dummies
+pd.DataFrame.Punkt
Beispiele
Was ich machen werde, für jede weitere Antwort und Frage ist zu beantworten mit
pd.DataFrame.pivot_table
. Dann werde ich alternativen, um die gleiche Aufgabe durchzuführen.Frage 3
pd.DataFrame.pivot_table
fill_value
ist standardmäßig nicht gesetzt. Ich Neige dazu, stellen Sie ihn entsprechend ein. In diesem Fall ich es auf0
. Beachten Sie, dass ich ausgelassen Frage 2, da es die gleichen wie diese Antwort, ohne diefill_value
aggfunc='mean'
ist die Standardeinstellung und ich habe nicht haben, um es. Ich habe es explizit.pd.DataFrame.groupby
pd.crosstab
Frage 4
pd.DataFrame.pivot_table
pd.DataFrame.groupby
pd.crosstab
Frage 5
Beachten Sie, dass für
pivot_table
undcross_tab
ich brauchte, um pass Liste von callables. Auf der anderen Seitegroupby.agg
in der Lage ist, strings für eine begrenzte Anzahl von speziellen Funktionen.groupby.agg
würde, auch haben die gleiche callables wir gingen zu den anderen, aber es ist oft effizienter zu nutzen, die Funktion string-Namen, da es die Effizienz gewonnen werden.pd.DataFrame.pivot_table
pd.DataFrame.groupby
pd.crosstab
Frage 6
pd.DataFrame.pivot_table
passieren wirvalues=['val0', 'val1']
aber wir könnten uns gelassen haben, die aus völligpd.DataFrame.groupby
Frage 7
pd.DataFrame.pivot_table
pd.DataFrame.groupby
Frage 8
pd.DataFrame.pivot_table
pd.DataFrame.groupby
pd.DataFrame.set_index
da die Schlüssel einzigartig sind für beide Zeilen und SpaltenFrage 9
pd.DataFrame.pivot_table
pd.DataFrame.groupby
pd.cross_tab
pd.factorize
+np.bincount
pd.get_dummies
InformationsquelleAutor piRSquared