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

我有一个 groupby 数组,其中需要按 A 进行分组,然后显示由 B1 和 B2 分隔的 B 实例的计数,最后显示 > 0.1 的实例的百分比,因此我这样做是为了获得前 2 个:


    A   B       C   

id                                      

118 a1  B1      0

119 a1  B1      0

120 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)

我得到了第一部分的正确结果:


                   B

B                  B1   B2

A

a1                  4   2

a2                  7   9

a3                  9   17

a4                  8   8

a5                  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         passed

B                  B1   B2   B1   B2

A

a1                  4   2    2    2

a2                  7   9    7    6

a3                  9   17   9    5


狐的传说
浏览 188回答 2
2回答

饮歌长啸

你可以做:(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 B2A                 a1  4  2      2  2

慕姐8265434

在解决你的问题时,我还想看看是否可以获得 B 的平均百分比(同时忽略 0)。我在获得计数的同时也能够完成此任务。本练习的数据框:     A   B       C0   a1  B1    0.001   a1  B1    0.002   a1  B1   98.873   a1  B1  101.104   a1  B2  106.675   a1  B2  103.006   a2  B1    0.007   a2  B1    0.008   a2  B1   33.009   a2  B1  100.0010  a2  B2   80.0011  a3  B1   90.0012  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 pdimport numpy as npdf = 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       B2A                                       a1     4  2      2  2    99.985  104.835a2     4  1      2  1    66.500   80.000a3     1  1      1  1    90.000   99.000
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python