首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每组小计的箱数、分组数和百分比(熊猫)

每组小计的箱数、分组数和百分比(熊猫)
EN

Stack Overflow用户
提问于 2021-11-02 14:20:27
回答 1查看 37关注 0票数 2

我想从子组合计中获得每一行的百分比。首先,我为数据帧创建了bin,然后进行分组。

我有以下数据帧:

代码语言:javascript
运行
复制
data = pd.DataFrame({'barrio':['Almagro','Palermo','Almagro','Almagro','Palermo','Palermo','Almagro','Almagro'],
                     'fuente':['A','A','B','B','B','A','B','A'], 
                     'valor':[1,6,5,3,5,10,8,4]})

bins = np.arange(0,data['valor'].max() + 1, 2)
labels = ['-'.join(map(str,(x,y))) for x, y in zip(bins[:-1], bins[1:])]
data['bins'] = pd.cut(data['valor'], bins=bins,labels = labels, include_lowest=True)

data = data.groupby(['barrio','fuente','bins']).agg({'valor':'count'})
data = data.groupby(level=0).apply(lambda x: 100 * x / float(x.sum()))

预期的结果将是:

代码语言:javascript
运行
复制
                        valor
barrio   fuente bins    
Almagro     A   0-2     50.00
                2-4     50.00
                4-6     0.00
                6-8     0.00
                8-10    0.00
            B   0-2     0.00
                2-4     33.00
                4-6     33.00
                6-8     33.00
                8-10    0.00
Palermo     A   0-2     0.00
                2-4     0.00
                4-6     50.00
                6-8     0.00
                8-10    50.00
            B   0-2     0.00
                2-4     0.00
                4-6     100.00
                6-8     0.00
                8-10    0.00

但我得到的结果是:

代码语言:javascript
运行
复制
            valor
barrio  fuente  bins    
Almagro     A   0-2     20.00
                2-4     20.00
                4-6     0.00
                6-8     0.00
                8-10    0.00
B               0-2     0.00
                2-4     20.00
                4-6     20.00
                6-8     20.00
                8-10    0.00
Palermo     A   0-2     0.00
                2-4     0.00
                4-6     33.33
                6-8     0.00
                8-10    33.33
B               0-2     0.00
                2-4     0.00
                4-6     33.33
                6-8     0.00
                8-10    0.00

我该如何解决这个问题呢?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-02 14:27:48

您可以在normalize中使用value_counts

代码语言:javascript
运行
复制
data.groupby(['barrio', 'fuente'])['bins'].value_counts(normalize=True)

输出:

代码语言:javascript
运行
复制
barrio   fuente  bins
Almagro  A       0-2     0.500000
                 2-4     0.500000
         B       2-4     0.333333
                 4-6     0.333333
                 6-8     0.333333
Palermo  A       4-6     0.500000
                 8-10    0.500000
         B       4-6     1.000000
Name: bins, dtype: float64

或者您可以使用crosstab,它在后台使用上面的代码:

代码语言:javascript
运行
复制
pd.crosstab([data['barrio'],data['fuente']], 
            data['bins'], normalize='index'
           ).stack()

输出:

代码语言:javascript
运行
复制
barrio   fuente  bins
Almagro  A       0-2     0.500000
                 2-4     0.500000
                 4-6     0.000000
                 6-8     0.000000
                 8-10    0.000000
         B       0-2     0.000000
                 2-4     0.333333
                 4-6     0.333333
                 6-8     0.333333
                 8-10    0.000000
Palermo  A       0-2     0.000000
                 2-4     0.000000
                 4-6     0.500000
                 6-8     0.000000
                 8-10    0.500000
         B       0-2     0.000000
                 2-4     0.000000
                 4-6     1.000000
                 6-8     0.000000
                 8-10    0.000000
dtype: float64
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69811979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档