为了账号安全,请及时绑定邮箱和手机立即绑定

计算 groupby 结果中大于 0 的列的值

计算 groupby 结果中大于 0 的列的值

狐的传说 2023-08-08 15:06:57
我有一个 groupby 数组,其中需要按 A 进行分组,然后显示由 B1 和 B2 分隔的 B 实例的计数,最后显示 > 0.1 的实例的百分比,因此我这样做是为了获得前 2 个:    A   B       C   id                                      118 a1  B1      0119 a1  B1      0120 a1  B1      101.1   121 a1  B1      106.67  122 a1  B2      103.33  237 a1  B2      100 df = pd.DataFrame(df.groupby(    ['A', 'B'])['B'].aggregate('count')).unstack(level=1)我得到了第一部分的正确结果:                   BB                  B1   B2Aa1                  4   2a2                  7   9a3                  9   17a4                  8   8a5                  7   8但是当我需要获得 > 0 的计数百分比时prcnt_complete = df[['A', 'B', 'C']]prcnt_complete['passed'] = prcnt_complete['C'].apply(lambda x: (float(x) > 1))prcnt_complete = prcnt_complete.groupby(['A', 'B', 'passed']).count()我得到一些毫无意义的奇怪值,有时 True 和 False 之间的总和甚至不相加。我试图按顺序理解我做错的事情,以便我能够理解它。我正在寻找的结果是这样的:                   B         passedB                  B1   B2   B1   B2Aa1                  4   2    2    2a2                  7   9    7    6a3                  9   17   9    5
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

你可以做:


(df['C'].gt(1).groupby([df['A'],df['B']])

    .agg(['size','sum'])

    .rename(columns={'size':'B','sum':'passed'})

    .unstack('B')

)

输出(来自样本数据):


       B    passed   

B  B1 B2     B1 B2

A                 

a1  4  2      2  2


查看完整回答
反对 回复 2023-08-08
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

在解决你的问题时,我还想看看是否可以获得 B 的平均百分比(同时忽略 0)。我在获得计数的同时也能够完成此任务。


本练习的数据框:


     A   B       C

0   a1  B1    0.00

1   a1  B1    0.00

2   a1  B1   98.87

3   a1  B1  101.10

4   a1  B2  106.67

5   a1  B2  103.00

6   a2  B1    0.00

7   a2  B1    0.00

8   a2  B1   33.00

9   a2  B1  100.00

10  a2  B2   80.00

11  a3  B1   90.00

12  a3  B2   99.00

排除零的情况下求平均值


为此我必须.replace(0, np.nan)在 groupby 函数之前添加。


A = ['a1','a1','a1','a1','a1','a1','a2','a2','a2','a2','a2','a3','a3']

B = ['B1','B1','B1','B1','B2','B2','B1','B1','B1','B1','B2','B1','B2']

C = [0,0,98.87,101.1,106.67,103,0,0,33,100,80,90,99]

import pandas as pd

import numpy as np

df = pd.DataFrame({'A':A,'B':B,'C':C})


df = pd.DataFrame(df.replace(0, np.nan)

                    .groupby(['A', 'B'])

                    .agg({'B':'size','C':['count','mean']})

                    .rename(columns={'size':'Count','count':'Passed','mean':'Avg Score'})).unstack(level=1)

df.columns = df.columns.droplevel(0)


   Count    Passed    Avg Score         

B     B1 B2     B1 B2        B1       B2

A                                       

a1     4  2      2  2    99.985  104.835

a2     4  1      2  1    66.500   80.000

a3     1  1      1  1    90.000   99.000


查看完整回答
反对 回复 2023-08-08
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信