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()
,并使用apply
与axis=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)
为方便起见,我四舍五入。
归档时间: |
|
查看次数: |
49204 次 |
最近记录: |