4

これが私が間違っているのか理解していないのか、それとも pandas crosstab または numpy size 関数のバグである可能性があるのか​​ はわかりません。

ここのパンダの例からの単純なデータフレームを使用しています

>>> df = DataFrame({'A': ['one', 'one', 'two', 'three'] * 6, 'B': ['A', 'B', 'C'] * 8, 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 'D': np.random.randn(24), 'E': np.random.randn(24)})

margins=True で単純なクロス集計を実行して合計を取得すると、期待どおりに機能します。

>>> crosstab(rows=[df['A'],df['B']], cols=[df['C']], margins=True)
C        bar  foo  All
A     B               
one   A    2    2    4
      B    2    2    4
      C    2    2    4
three A    2    0    2
      B    0    2    2
      C    2    0    2
two   A    0    2    2
      B    2    0    2
      C    0    2    2
All       12   12   24

np.size 関数を直接使用すると、同じ結果が得られます。

>>> crosstab(rows=[df['A'],df['B']], cols=[df['C']], margins=True, aggfunc=[np.size])
C        bar  foo  All
A     B               
one   A    2    2    4
      B    2    2    4
      C    2    2    4
three A    2    0    2
      B    0    2    2
      C    2    0    2
two   A    0    2    2
      B    2    0    2
      C    0    2    2
All       12   12   24

Pandas では、複数の集計関数を渡して、1 つのクロス集計でカウントと平均を取得できます。ただし、これを行うと、foo と bar の両方のサイズのカウントは前の呼び出しの 2 倍になりますが、全体の合計は正しいままです。

>>> crosstab(rows=[df['A'],df['B']], cols=[df['C']], margins=True, aggfunc=[np.size, np.mean], values=df['D'])
         size                mean                    
C         bar  foo  All       bar       foo       All
A     B                                              
one   A     2    2    4  0.245998  0.076366  0.161182
      B     2    2    4 -0.739757  0.137780 -0.300988
      C     2    2    4 -1.555759 -1.446554 -1.501157
three A     2  NaN    2  1.216109       NaN  1.216109
      B   NaN    2    2       NaN  0.255482  0.255482
      C     2  NaN    2  0.732448       NaN  0.732448
two   A   NaN    2    2       NaN -0.273747 -0.273747
      B     2  NaN    2 -0.001649       NaN -0.001649
      C   NaN    2    2       NaN  0.685422  0.685422
All        24   24   24 -0.017102 -0.094208 -0.055655

ここで何か不足していますか?2つのケースでこれが異なる動作をするのはなぜですか?

4

1 に答える 1

2

わかりました、私はそれが何をしているのかについていくつかの考えを持っています.

のソース コードを掘り下げるpandas/pandas/tools/pivot.pyと、次のステートメントになります。

row_margin = data[cols + values].groupby(cols).agg(aggfunc)

ここで、cols は df['C'] で、値は df['D'] です。これら 2 つを列でグループ化し、集計関数 (この場合は np.size) を適用します。各行は次のようになります

In [158]: data[cols + values].groupby(cols).nth(0)
Out[158]: 
     __dummy__
C             
bar  -1.823026
foo   0.465117

' np.size()_ D_

これが期待されているかどうかは、他の誰かが教えてくれるかもしれません。ソースコードの一部については、まだ少し混乱しています。また何か分かったら編集します。

于 2013-06-22T17:12:56.503 に答える