这是我的数据帧的样例:
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%
发布于 2018-04-12 01:46:08
我认为首先需要聚合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%
发布于 2018-04-12 17:17:39
要做到这一点,最好的方法是将所有行业放在一个数组中。在我的解决方案中,我称之为暴躁。
首先得到所有行业的总和。
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........
https://stackoverflow.com/questions/49781355
复制相似问题