首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(Python)如何获得pandas中多列总和的平均值

(Python)如何获得pandas中多列总和的平均值
EN

Stack Overflow用户
提问于 2018-04-12 01:38:52
回答 2查看 1.2K关注 0票数 1

这是我的数据帧的样例:

代码语言:javascript
运行
复制
company_name country_code state_code software finance commerce etc......
google       USA           CA          1        0          0
jimmy        GBR           unknown     0        0          1
microsoft    USA           NY          1        0          0

我想要得到每个州每个行业的平均数量,例如: CA中14%的行业是软件行业,CA中15%的行业是医疗保健行业,等等。

显然,我需要获得每个州所有行业的公司总数,并将每个行业的公司数量除以这个值,以获得每个行业在每个州的百分比。

我只是想不出一个有效的方法来做这件事。

显然,我尝试过以不同的方式使用类似的东西,但都无济于事:

代码语言:javascript
运行
复制
new_df = df['state_code'].value_counts(normalize=True)

我想得到所有栏目的总和,软件,金融,商业等…然后给出每一列与其他列比较时的百分比。

预期输出:

代码语言:javascript
运行
复制
State_Code software finance commerce etc..... 
CA           20%      10%     5%       65%
NY           10%      20%     10%      60%
AH           5%       5%      20%      70%
EN

回答 2

Stack Overflow用户

发布于 2018-04-12 01:46:08

我认为首先需要聚合sum,然后除以每行列的div和:

代码语言:javascript
运行
复制
print (df)
  company_name country_code state_code  software  finance  commerce
0       google          USA         CA         1        0         4
1        jimmy          GBR    unknown         5        6         1
2    microsoft          USA         NY         1        0         0


#convert all columns without first to floats or ints
cols = df.columns.difference(['company_name', 'country_code', 'state_code'])
df[cols] = df[cols].astype(float)
#if not possible use astype because some non numeric values 
#df[cols] = df[cols].apply(lambda x: pd.to_numeric(x, errors='coerce'))

a = df.groupby(['state_code']).sum()
df = a.div(a.sum(axis=1), axis=0)
print (df)
            software  finance  commerce
state_code                             
CA          0.200000      0.0  0.800000
NY          1.000000      0.0  0.000000
unknown     0.416667      0.5  0.083333

如果你还需要百分比,乘以100,如果有必要,加上round并转换为integers:

代码语言:javascript
运行
复制
df = a.div(a.sum(1), axis=0).mul(100).round(0).astype(int)
print (df)
            software  finance  commerce
state_code                             
CA                20        0        80
NY               100        0         0
unknown           42       50         8

最后添加percentage,但值不是数字,因此以后不可能进行任何处理:

代码语言:javascript
运行
复制
df = a.div(a.sum(1), axis=0).mul(100).round(0).astype(int).astype(str).add('%')
print (df)
           software finance commerce
state_code                          
CA              20%      0%      80%
NY             100%      0%       0%
unknown         42%     50%       8%
票数 2
EN

Stack Overflow用户

发布于 2018-04-12 17:17:39

要做到这一点,最好的方法是将所有行业放在一个数组中。在我的解决方案中,我称之为暴躁。

首先得到所有行业的总和。

代码语言:javascript
运行
复制
count = 0
for i in testy:
count += int(usa_df[i].sum())

然后将这个总和除以每个行业的总数,再除以计数,再乘以100%,就会得到每个行业在市场中的百分比。

代码语言:javascript
运行
复制
for i in testy:
    tot = usa_df[i].sum()
    percent = (tot/count)*100
    print(i+" - "+str(percent)+"%"

输出将如下所示:

代码语言:javascript
运行
复制
software - 20%
finance  - 30%
commerce - 10%
etc........ 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49781355

复制
相关文章

相似问题

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