对数据帧进行排序并使用百分比计算值

Sad*_*ksk 3 python dataframe python-3.x pandas

我有一个像这样的DataFrame:

Kind   Status
1      True
2      False
3      True
2      False
2      True
Run Code Online (Sandbox Code Playgroud)

我用它计算了种类,df.Kind.sort_values() 得到了这个:

1       1
2       3
3       1
Run Code Online (Sandbox Code Playgroud)

现在我想看看Kind 2中有多少是真或假的数字和百分比.像这样:

Art  True  False
  2     1      2
  2  0.33   0.66
Run Code Online (Sandbox Code Playgroud)

有人能帮我吗?最好的祝福

jpp*_*jpp 7

交叉号+ div

使用pandas.crosstab:

res = pd.crosstab(df['Kind'], df['Status'])

res[['Pct False', 'Pct True']] = res.div(res.sum(axis=1), axis=0)

print(res)

Status  False  True  Pct False   Pct True
Kind                                     
1           0     1   0.000000   1.000000
2           2     1   0.666667   0.333333
3           0     1   0.000000   1.000000
Run Code Online (Sandbox Code Playgroud)

在我看来,这是显示数据的最自然的方式.不建议将计数与单个系列中的百分比相结合.

交叉表+交叉表规范化

或者,您可以加入一些crosstab结果,一个标准化,另一个不标准化.

res = pd.crosstab(df['Kind'], df['Status'])\
        .join(pd.crosstab(df['Kind'], df['Status'], normalize='index'), rsuffix='_pct')

print(res)

Status  False  True  False_pct  True_pct
Kind                                    
1           0     1   0.000000  1.000000
2           2     1   0.666667  0.333333
3           0     1   0.000000  1.000000
Run Code Online (Sandbox Code Playgroud)

交叉表仅规范化

如果您只查看百分比,则可以使用以下normalize参数:

res = pd.crosstab(df['Kind'], df['Status'], normalize='index')

print(res)

Status     False     True 
Kind                      
1       0.000000  1.000000
2       0.666667  0.333333
3       0.000000  1.000000
Run Code Online (Sandbox Code Playgroud)