2012-12-06 62 views
7

我正在閱讀Wes Mckinney的數據分析Python,但是我對這個數據操作感到驚訝。你可以看到所有的程序here,但我會盡量在這裏總結一下。假設你有這樣的事情:怪異的熊貓數據操作

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手段時區和Not Windows,並從用戶代理的原始數據中提取Windows是類,所以我們可以看到,有3個Windows用戶和0非Windows用戶從非洲/開羅收集到的數據。

然後,爲了得到「頂總時間區」,我們有:

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

所以在這一點上,我還以爲,根據documentation我列求和(在sum(1))和然後根據顯示參數的結果進行排序(通常在argsort中)。首先,我不確定這個系列中的「列」是什麼意思,因爲sum(1)實際上是總結Not WindowsWindows用戶將該值保持在與其時區相同的行中。此外,我看不到argsort值與agg_counts之間的相關性。例如,Pacific/Auckland的「argsort值」(In[134])爲0,它只有11 WindowsNot Windows用戶的總和。 Asia/Harbin的argsort值爲1,出現的總數爲3 Windows,而非Windows用戶。

有人可以向我解釋那裏發生了什麼嗎?顯然我誤解了一些東西。

+0

這是一個在這本書一個非常混亂的例子) – Winand

回答

3

sum(1)表示總和超過axis = 1。術語來自numpy

對於2+維對象,0軸指的是行。在0軸上進行求和意味着對行進行求和,這相當於「垂直」求和(當查看錶格時)。

1軸指的是列。在1軸上求和意味着在列上求和,這相當於「水平」求和。


numpy.argsort返回指數,告訴你如何排序的數組的數組。例如:

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

np.argsort返回的數組中的2是指在x最小值是x[2],它等於1。下一個最小的是x[4]這也是1.依此類推。

如果我們定義

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 

然後totals.argsort()被argsorting值[521, 3, 1, 2, 1, 1, 5]。我們已經看到了結果;它是一樣的numpy.argsort

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

這些值只會做成Series,與同indextotals

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

關聯的totals.index這個argsort指數沒有出現具有內在含義,但是如果您計算totals[totals.argsort()],您會看到按排序順序排列的totals行:

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

正確!非常感謝。在這種情況下argsort似乎不是很有用,因爲它沒有提到第一列。這很混亂。 –