这是我的数据框架的示例:
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%
答案 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........