1

これは単純な問題ですが、何らかの理由で簡単な解決策を見つけることができません。

たとえば、階層的にインデックス化されたシリーズがあります。

s = pd.Series(data=randint(0, 3, 45),
              index=pd.MultiIndex.from_tuples(list(itertools.product('pqr',[0,1,2],'abcde')),
              names=['Index1', 'Index2', 'Index3']), name='P')

s = s.map({0:'A', 1:'B', 2:'C'})

だから、それは

Index1  Index2  Index3
p       0       a         A
                b         A
                c         C
                d         B
                e         C
        1       a         B
                b         C
                c         C
                d         B
                e         B
q       0       a         B
                b         C
                c         C
                d         C
                e         C
        1       a         A
                b         A
                c         B
                d         C
                e         A

出力が次のようになるように、値で頻度カウントを行いたい

Index1  Index2  P
p       0       A         2
                B         1
                C         2
        1       A         0
                B         3
                C         2
q       0       A         0
                B         1
                C         4
        1       A         3
                B         1
                C         1
4

1 に答える 1

3

value_countsシリーズ groupby に適用できます。

In [11]: s.groupby(level=[0, 1]).value_counts()  # equiv .apply(pd.value_counts)
Out[11]: 
Index1  Index2   
p       0       C    2
                A    2
                B    1
        1       B    3
                A    2
        2       A    3
                B    1
                C    1
q       0       A    3
                B    1
                C    1
        1       B    2
                C    2
                A    1
        2       C    3
                B    1
                A    1
r       0       A    3
                B    1
                C    1
        1       B    3
                C    2
        2       B    3
                C    1
                A    1
dtype: int64

0 を含めたい場合 (上記は含まれません)、次のように使用できますcross_tab

In [21]: ct = pd.crosstab(rows=[s.index.get_level_values(0), s.index.get_level_values(1)],
                          cols=s.values,
                          aggfunc=len,
                          rownames=s.index.names[:2],
                          colnames=s.index.names[2:3])

In [22]: ct
Out[22]: 
Index3         A  B  C
Index1 Index2         
p      0       2  1  2
       1       2  3  0
       2       3  1  1
q      0       3  1  1
       1       1  2  2
       2       1  1  3
r      0       3  1  1
       1       0  3  2
       2       1  3  1

In [23]: ct.stack()
Out[23]: 
Index1  Index2  Index3
p       0       A         2
                B         1
                C         2
        1       A         2
                B         3
                C         0
        2       A         3
                B         1
                C         1
q       0       A         3
                B         1
                C         1
        1       A         1
                B         2
                C         2
        2       A         1
                B         1
                C         3
r       0       A         3
                B         1
                C         1
        1       A         0
                B         3
                C         2
        2       A         1
                B         3
                C         1
dtype: int64

どちらが少し速いかもしれません...

于 2013-09-12T16:29:51.463 に答える