7

我正在阅读 Wes Mckinney 的 Python for Data Analysis,但我对这种数据操作感到惊讶。你可以在这里看到所有的过程,但我会在这里总结一下。假设你有这样的事情:

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 WindowsWindows是从原始数据中的User Agent中提取的类别,所以我们可以从收集的数据中看到非洲/开罗有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
...

所以在那一点上,我会认为根据文档我正在对列(in sum(1))求和,然后根据显示参数的结果进行排序(就像在 argsort 中一样)。首先,我不确定在本系列的上下文中“列”是什么意思,因为sum(1)实际上是求和Not Windows,并且Windows用户将该值与其时区保持在同一行中。此外,我看不到 argsort 值和agg_counts. 例如,Pacific/Auckland具有In[134]0 的“argsort 值”(in )并且它只有 11WindowsNot Windowsusers 的总和。Asia/Harbinargsort 值为 1,总和为 3Windows且不是 Windows 用户。

有人可以向我解释那里发生了什么吗?显然我误解了一些东西。

4

2 回答 2

4

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

返回的数组中的 2表示isnp.argsort中的最小值,等于。下一个最小的也是 1。依此类推。xx[2]1x[4]

如果我们定义

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]

这些值被简单地制成 a Series,与index相同totals

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
于 2012-12-06T22:11:57.133 回答
-1

我喜欢 unutbu 的澄清。在上面倒数第二个表中,print(totals.argsort()),忽略第一列。我们需要的是第二列,它给出了我们需要的位置。这太酷了!

以下是一些关于 take 方法的示例:https ://pandas-docs.github.io/pandas-docs-travis/advanced.html#take-methods

于 2015-12-18T20:42:10.050 回答