Pandas中奇怪的数据操作

Rob*_*ith 7 python pandas

我正在阅读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
    ...
Run Code Online (Sandbox Code Playgroud)

tz表示时区和Not WindowsWindows是从原始数据中的用户代理提取的类别,因此我们可以从收集的数据中看到非洲/开罗有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
...
Run Code Online (Sandbox Code Playgroud)

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

有人可以向我解释那里发生了什么吗?显然我误解了一些事情.

unu*_*tbu 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])
Run Code Online (Sandbox Code Playgroud)

返回的数组中的 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
Run Code Online (Sandbox Code Playgroud)

然后totals.argsort()是 arg 对值进行排序[521, 3, 1, 2, 1, 1, 5]。我们已经看到了结果;它与numpy.argsort

[2, 4, 5, 3, 1, 6, 0]
Run Code Online (Sandbox Code Playgroud)

这些值简单地制成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
Run Code Online (Sandbox Code Playgroud)

将 与此 argsort 索引相关联totals.index似乎没有内在含义,但如果您计算,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
Run Code Online (Sandbox Code Playgroud)