2012-12-06 64 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似乎不是很有用,因为它没有提到第一列。这很混乱。 –