2012-12-06 23 views
7

Czytam Pythona do analizy danych Wesa Mckinneya, ale byłem zaskoczony tą manipulacją danymi. Możesz zobaczyć całą procedurę here, ale spróbuję podsumować ją tutaj. Zakładam, że masz coś takiego:Dziwna manipulacja danymi w Pandach

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 oznacza strefę czasową i Not Windows i Windows to kategorie wyodrębnione z User Agent w oryginalnych danych, dzięki czemu możemy zobaczyć, że istnieją 3 Użytkownicy Windows i 0 innych niż Windows użytkowników w Afryce/Kairze z zebranych danych.

Następnie w celu uzyskania „top ogólne strefy czasowe” mamy:

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 
... 

Więc w tym momencie, to bym pomyślał, że zgodnie z documentation byłem zsumowanie kolumny (w sum(1)) i następnie sortowanie według wyników pokazujących argumenty (jak zwykle w argsort). Przede wszystkim nie jestem pewien, co to znaczy "kolumny" w kontekście tej serii, ponieważ sum(1) faktycznie sumuje użytkowników Not Windows i Windows utrzymujących tę wartość w tym samym wierszu, co jej strefa czasowa. Ponadto nie widzę korelacji między wartościami argsort i agg_counts. Na przykład Pacific/Auckland ma "wartość argsort" (w In[134]) z 0 i ma tylko sumę 11 Windows i Not Windows użytkowników. Asia/Harbin ma wartość argsort równą 1 i pojawia się z sumą 3 Windows i użytkowników niezainerwowanych przez system Windows.

Czy ktoś może mi wyjaśnić, co się tam dzieje? Najwyraźniej coś nie rozumiem.

+0

To bardzo mylące przykład w tej książce) – Winand

Odpowiedz

3

sum(1) oznacza sumę ponad axis = 1. Terminologia pochodzi od numpy.

Dla obiektu 2+ wymiarowego oś 0 odnosi się do rzędów. Zsumowanie nad osią 0 oznacza sumowanie rzędów, co oznacza sumowanie "pionowo" (patrząc na tabelę).

1-osiowy odnosi się do kolumn. Podsumowując na 1-osi oznacza sumowanie w kolumnach, co oznacza sumowanie "w poziomie".


numpy.argsort zwraca tablicę indeksów które powiedzieć, jak posortować tablicę. Np

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]) 

W 2 w tablicy zwróconej przez np.argsort oznacza najmniejszą wartość x jest x[2], co odpowiada 1. Następny najmniejszy to x[4], który również jest 1. I tak dalej.

Jeśli zdefiniujemy

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 

następnie totals.argsort() jest argsorting wartości [521, 3, 1, 2, 1, 1, 5].Widzieliśmy wynik; jest taka sama jak numpy.argsort:

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

Wartości te są po prostu wykonane w Series, z tym samym index jak totals:

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

Kojarzenie totals.index z tym indeksy argsort nie wydaje się mieć wewnętrzną znaczenia , ale jeśli obliczysz totals[totals.argsort()] zobaczysz wiersze totals w posortowanej kolejności:

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

rację! Wielkie dzięki. Argsort w tym kontekście nie wydaje się zbyt użyteczny, ponieważ nie odnosi się do pierwszej kolumny. To było bardzo mylące. –