2012-12-06 8 views
7

Ich lese Python für Datenanalyse von Wes Mckinney, aber ich war von dieser Datenmanipulation überrascht. Sie können alle Verfahren here sehen, aber ich werde versuchen, es hier zusammenzufassen. Angenommen, Sie so etwas wie dieses:Seltsame Datenmanipulation in Pandas

In [133]: agg_counts = by_tz_os.size().unstack().fillna(0) 
    Out[133]: 
    a     Not Windows Windows 
    tz     245   276 
    Africa/Cairo   0   3 
    Africa/Casablanca 0   1 
    Africa/Ceuta   0   2 
    Africa/Johannesburg 0   1 
    Africa/Lusaka  0   1 
    America/Anchorage 4   1 
    ... 

tz Zeitzone bedeutet und Not Windows und Windows sind Kategorien aus dem User-Agent in den Originaldaten extrahiert, so können wir sehen, dass es 3 Windows-Benutzer und 0 Nicht-Windows-Benutzer in Afrika/Kairo aus den gesammelten Daten.

Dann, um „die Top-Gesamtzeitzonen“ zu bekommen haben wir:

In [134]: indexer = agg_counts.sum(1).argsort() 
Out[134]: 
tz 
            24 
Africa/Cairo      20 
Africa/Casablanca     21 
Africa/Ceuta      92 
Africa/Johannesburg    87 
Africa/Lusaka      53 
America/Anchorage     54 
America/Argentina/Buenos_Aires 57 
America/Argentina/Cordoba   26 
America/Argentina/Mendoza   55 
America/Bogota     62 
... 

So an diesem Punkt würde ich gedacht, dass nach den documentation ich Spalt Summieren über (in sum(1)) und dann Sortierung nach dem Ergebnis mit Argumenten (wie in argsort üblich). Zunächst einmal bin ich nicht sicher, was es bedeutet "Spalten" im Kontext dieser Serie, weil sum(1) tatsächlich summiert Not Windows und Windows Benutzer diesen Wert in der gleichen Zeile wie seine Zeitzone. Außerdem kann ich keine Korrelation zwischen Argsort-Werten und agg_counts sehen. Zum Beispiel hat Pacific/Auckland einen "argsort value" (in In[134]) von 0 und es hat nur eine Summe von 11 Windows und Not Windows Benutzer. Asia/Harbin hat einen Argsort-Wert von 1 und wird mit einer Summe von 3 Windows und Nicht-Windows-Benutzern angezeigt.

Kann mir jemand erklären, was dort vor sich geht? Offensichtlich verstehe ich etwas falsch.

+0

Es ist ein wirklich verwirrend Beispiel in diesem Buch) – Winand

Antwort

3

sum(1) bedeutet Summe über axis = 1. Die Terminologie stammt von numpy.

Bei einem zweidimensionalen Objekt bezieht sich die 0-Achse auf die Zeilen. Summierung über die 0-Achse bedeutet Summierung über die Zeilen, was zur Summierung "vertikal" (beim Blick auf den Tisch) führt.

Die 1-Achse bezieht sich auf die Spalten. Summierung über die 1-Achse bedeutet Summierung über die Spalten, was zur Summierung "horizontal" führt.


numpy.argsort gibt ein Array von Indizes, die Ihnen sagen, wie ein Array zu sortieren. Zum Beispiel:

In [72]: import numpy as np 

In [73]: x = np.array([521, 3, 1, 2, 1, 1, 5]) 

In [74]: np.argsort(x) 
Out[74]: array([2, 4, 5, 3, 1, 6, 0]) 

Die 2 in der Anordnung zurückgeführt, indem np.argsort bedeutet, der kleinste Wert in xx[2] ist, die 1 entspricht. Das nächstkleinste ist x[4], das ist auch 1. Und so weiter.

Wenn wir

totals = df.sum(1) 
print(totals) 
# tz      521 
# Africa/Cairo    3 
# Africa/Casablanca  1 
# Africa/Ceuta    2 
# Africa/Johannesburg  1 
# Africa/Lusaka   1 
# America/Anchorage  5 

dann totals.argsort() wird argsorting die Werte [521, 3, 1, 2, 1, 1, 5] definieren.Wir haben das Ergebnis gesehen; es ist die gleiche wie numpy.argsort:

[2, 4, 5, 3, 1, 6, 0] 

Diese Werte einfach in ein Series gemacht werden, mit der gleichen index wie totals:

print(totals.argsort()) 
# tz      2 
# Africa/Cairo   4 
# Africa/Casablanca  5 
# Africa/Ceuta   3 
# Africa/Johannesburg 1 
# Africa/Lusaka   6 
# America/Anchorage  0 

die totals.index mit diesem argsort Indizes verknüpfen scheint nicht über intrinsische Bedeutung , aber wenn Sie totals[totals.argsort()] berechnen, sehen Sie die Reihen von in sortierter Reihenfolge:

print(totals[totals.argsort()]) 
# Africa/Casablanca  1 
# Africa/Johannesburg  1 
# Africa/Lusaka   1 
# Africa/Ceuta    2 
# Africa/Cairo    3 
# America/Anchorage  5 
# tz      521 
+0

Recht! Danke vielmals. argsort scheint in diesem Zusammenhang nicht sehr nützlich zu sein, da es sich nicht auf die erste Spalte bezieht. Das war sehr verwirrend. –