简体   繁体   English

如何将计算的百分比添加到熊猫数据透视表

[英]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 . 您可以使用groupbytransformsum 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM