对数据帧排序并用百分比计数值

2024-05-14 19:28:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

Kind   Status
1      True
2      False
3      True
2      False
2      True

我用它数了一下种类df.Kind.sort_values() 得到了这个:

^{pr2}$

现在我想看看第2类的数字和百分比有多少是真是假。像这样:

Art  True  False
  2     1      2
  2  0.33   0.66

有人能帮我吗? 谨致问候


Tags: 数据falsetruedfstatus数字sort百分比
3条回答

交叉表+div

使用^{}

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

在我看来,这是最自然的方式来显示你的数据。不建议将单个百分比与单个计数组合。在

交叉表+交叉表规范化

或者,您可以加入两个crosstab结果,一个是标准化的,另一个不是。在

^{pr2}$

交叉表仅规格化

如果只查找百分比,则可以使用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

^{}^{}和{a3}一起用于counts的枢轴:

df1 = df.groupby(['Kind','Status']).size().unstack(fill_value=0)
#alternative solution, slowier in large data
#df1 = pd.crosstab(df['Kind'], df['Status'])
print (df1)
Status  False  True 
Kind                
1           0      1
2           2      1
3           0      1

然后除以sum并附加到原始值:

^{pr2}$
print (df.loc[2])
Status     False     True 
Kind                      
2       2.000000  1.000000
2       0.666667  0.333333

但是,如果希望避免将integers转换为floats,请将append更改为{},并为唯一列添加^{}

df = df1.join(df1.div(df1.sum(axis=1), axis=0).add_prefix('pct '))
print (df)
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

print (df.loc[[2]])

Status  False  True  pct False  pct True
Kind                                    
2           2     1   0.666667  0.333333

您可以简单地使用:

g = df.loc[df['Kind']==2].groupby(['Kind', 'Status']).size().unstack()
pd.concat([g,g.apply(lambda x: round(x / (x[False]+x[True]), 2), axis=1)])

输出:

^{pr2}$

相关问题 更多 >

    热门问题