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

时间:2018-04-11 17:38:52

标签: python pandas

这是我的数据框架的示例:

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%的行业是医疗保健等......

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

我无法找到一种有效的方法来做到这一点。

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

new_df = df['state_code'].value_counts(normalize=True)

我希望获得所有列软件,财务,商业等的总和......然后在与其他列进行比较时给出每列的百分比。

预期产出:

State_Code software finance commerce etc..... 
CA           20%      10%     5%       65%
NY           10%      20%     10%      60%
AH           5%       5%      20%      70%

2 个答案:

答案 0 :(得分:2)

我认为需要首先汇总sum,然后除以每行的div列总数:

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并投放到integer s:

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,但后来的数值不是数字,因此以后不再可能进行处理:

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%

答案 1 :(得分:0)

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

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

count = 0
for i in testy:
count += int(usa_df[i].sum())

然后将此总和除以每个行业的总和,并将其除以计数并乘以100% 这将使您获得市场中每个行业的百分比。

for i in testy:
    tot = usa_df[i].sum()
    percent = (tot/count)*100
    print(i+" - "+str(percent)+"%"

输出如下:

software - 20%
finance  - 30%
commerce - 10%
etc........