如何用百分比制作熊猫交叉表?

Bri*_*gan 47 python crosstab pandas

给定具有不同分类变量的数据帧,如何返回具有百分比而不是频率的交叉表?

df = pd.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)})


pd.crosstab(df.A,df.B)


B       A    B    C
A               
one     4    4    4
three   2    2    2
two     2    2    2
Run Code Online (Sandbox Code Playgroud)

使用交叉表中的边距选项来计算行和列总数让我们足够接近,认为应该可以使用aggfunc或groupby,但是我的微脑无法想到它.

B       A     B    C
A               
one     .33  .33  .33
three   .33  .33  .33
two     .33  .33  .33
Run Code Online (Sandbox Code Playgroud)

Har*_*rry 58

从Pandas 0.18.1开始,有一个normalize选项:

In [1]: pd.crosstab(df.A,df.B, normalize='index')
Out[1]:

B              A           B           C
A           
one     0.333333    0.333333    0.333333
three   0.333333    0.333333    0.333333
two     0.333333    0.333333    0.333333
Run Code Online (Sandbox Code Playgroud)

您可以在哪里all,index(行)或columns.

文档中提供更多详细信息.


Bre*_*arn 50

pd.crosstab(df.A, df.B).apply(lambda r: r/r.sum(), axis=1)
Run Code Online (Sandbox Code Playgroud)

基本上你只是有确实的功能row/row.sum(),并使用applyaxis=1按行应用它.

(如果在Python 2中执行此操作,则应使用from __future__ import division以确保除法始终返回浮点数.)


gab*_*bra 10

我们可以通过乘以百分比来显示它100

pd.crosstab(df.A,df.B, normalize='index')\
    .round(4)*100

B          A      B      C
A                         
one    33.33  33.33  33.33
three  33.33  33.33  33.33
two    33.33  33.33  33.33
Run Code Online (Sandbox Code Playgroud)

为方便起见,我四舍五入。