[英]How to add calculated % to a pandas pivottable
I have a pivottable similiar to this question , which doesn't seem to have an answer. 我有一个与此问题类似的枢纽,似乎没有答案。 I have a pivottable called
grouped
like this: 我有一个称为
grouped
的数据透视表,如下所示:
grouped = age_gender_bkts.pivot_table('population_in_thousands',index='gender',
columns='country_destination', aggfunc='sum').unstack()
This is taken from the pandas dataframe age_gender_bkts: 这摘自熊猫数据框age_gender_bkts:
age_gender_bkts = pd.read_csv('airbnb/age_gender_bkts.csv')
age_gender_bkts[:10]
age_bucket country_destination gender population_in_thousands year
0 100+ AU male 1 2015
1 95-99 AU male 9 2015
2 90-94 AU male 47 2015
3 85-89 AU male 118 2015
4 80-84 AU male 199 2015
5 75-79 AU male 298 2015
6 70-74 AU male 415 2015
7 65-69 AU male 574 2015
8 60-64 AU male 636 2015
9 55-59 AU male 714 2015
I am looking to get, for each country, the ratio between male and female population_in_thousands
as a % for each gender eg 12024/11899+12024
for AU
. 我希望获得每个国家的男女性别
population_in_thousands
,以%为单位,例如AU
12024/11899+12024
。
I am very new to pandas, numpy, looking for a generic solution to calculate columns based on pivot_table
. 我是numpy的熊猫新手,正在寻找一种通用的解决方案来基于
pivot_table
计算列。 Also, if the reply has a way for me to have created these groups by gender and country without using pivot_table
, eg groupby
(I couldn't figure it out), that would really help me in my learning. 另外,如果回复中有一种方法可以让我按性别和国家(地区)创建这些分组,而无需使用
pivot_table
,例如groupby
(我无法弄清楚),那将对我的学习有所帮助。
You can use groupby
, transform
and sum
. 您可以使用
groupby
, transform
和sum
。 Last you can merge
data to original DataFrame
: 最后,您可以
merge
数据merge
到原始DataFrame
:
print age_gender_bkts
age_bucket country_destination gender population_in_thousands year
0 100+ AU male 1 2015
1 95-99 AU male 9 2015
2 90-94 CA male 47 2015
3 85-89 CA male 118 2015
4 80-84 AU male 199 2015
5 75-79 NL male 298 2015
6 70-74 NL male 415 2015
7 65-69 AU male 574 2015
8 60-64 AU male 636 2015
9 55-59 AU male 714 2015
grouped = age_gender_bkts.pivot_table('population_in_thousands',index='gender', columns='country_destination', aggfunc='sum').unstack()
df = (grouped / grouped.groupby(level=0).transform(sum)).reset_index().rename(columns={0:'prop'})
print df
country_destination gender prop
0 AU male 1
1 CA male 1
2 NL male 1
print pd.merge(age_gender_bkts, df, on=['country_destination', 'gender'])
age_bucket country_destination gender population_in_thousands year prop
0 100+ AU male 1 2015 1
1 95-99 AU male 9 2015 1
2 80-84 AU male 199 2015 1
3 65-69 AU male 574 2015 1
4 60-64 AU male 636 2015 1
5 55-59 AU male 714 2015 1
6 90-94 CA male 47 2015 1
7 85-89 CA male 118 2015 1
8 75-79 NL male 298 2015 1
9 70-74 NL male 415 2015 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.