【问题标题】:How to add calculated % to a pandas pivottable如何将计算百分比添加到熊猫数据透视表
【发布时间】:2016-02-05 21:25:34
【问题描述】:

我有一个类似于this question 的数据透视表,但似乎没有答案。我有一个名为 grouped 的数据透视表,如下所示:

grouped = age_gender_bkts.pivot_table('population_in_thousands',index='gender',
columns='country_destination', aggfunc='sum').unstack()

这取自 pandas 数据框 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

我希望获得每个国家/地区的男性和女性 population_in_thousands 之间的比例,作为每种性别的百分比,例如12024/11899+12024AU

我对 pandas 非常陌生,numpy,正在寻找基于pivot_table 计算列的通用解决方案。此外,如果回复可以让我在不使用pivot_table 的情况下按性别和国家/地区创建这些组,例如groupby(我想不通),这对我的学习很有帮助。

【问题讨论】:

  • 你可以添加问题文本而不是图像吗?
  • 我也为你添加了。
  • @jezrael 我认为您不需要在这里回答问题
  • 好吧,也许你可以试试print grouped / grouped.groupby(level=0).transform(sum)
  • 是的,这行得通!如何将该计算添加到原始 df 中的新列,例如age_gender_bkts['prop']?

标签: python numpy pandas


【解决方案1】:

您可以使用groupbytransformsum。最后可以把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

【讨论】:

    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 2016-09-06
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多