2012-12-06 20 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])があり、合計値は11 WindowsNot Windowsです。 Asia/Harbinには1のargsort値があり、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における最小値が1に等しいx[2]、であることを意味します。次に小さいものはx[4]であり、これも1である。

私たちは、その後totals.argsort()は値[521, 3, 1, 2, 1, 1, 5]をargsortingさ

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 

を定義した場合。我々はその結果を見た。それはnumpy.argsortと同じです:

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

これらの値は単にtotalsと同じindexで、Seriesに作られています:

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

この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 
+0

右!どうもありがとう。この文脈でのargsortは、最初のカラムを参照していないのであまり役に立ちません。それは非常に混乱していた。 –

-1

私はunutbuの説明を愛しました。上の2番目の表のprint(totals.argsort())では、最初の列は無視されます。私たちが必要とするのは、私たちが必要とするポジションを与える2列目です。これはとてもクールです!ここで

はテイク法上のいくつかの例は次のとおりです。https://pandas-docs.github.io/pandas-docs-travis/advanced.html#take-methods