python - 从 Pandas 数据透视表中的小计中获取总数的百分比

标签 python pandas

我有以下数据框

from io import StringIO
incsv = StringIO("""Date,State,City,Tools,Size,y
20130320,AZ,Phoenix,A,4,1000
20130320,AZ,Tempe,B,4,1100
20130320,NY,NYC,C,1,900
20130320,NY,NYC,C,2,1300
20130320,NY,Albany,D,1,800
20130320,AZ,Phoenix,E,1,800
20130320,AZ,Phoenix,F,4,800
""")

df = pd.read_csv(incsv, index_col=['Date'], parse_dates=True)


df
          State City  Tools Size y
Date                    
2013-03-20  AZ  Phoenix A   4   1000
2013-03-20  AZ  Tempe   B   4   1100
2013-03-20  NY  NYC     C   1   900
2013-03-20  NY  NYC     C   2   1300
2013-03-20  NY  Albany  D   1   800
2013-03-20  AZ  Phoenix E   1   800
2013-03-20  AZ  Phoenix F   4   800

我正在尝试计算每种尺寸的工具占州/市小计的百分比。我的下一步是:

dftest=pd.pivot_table(df,index=['State'],columns=['City','Size'],values="y",aggfunc='count',margins=True)
test=dftest.stack('City').stack('Size')
test


State  City     Size
AZ     All              4.0
       Phoenix  1       1.0
                4       2.0
       Tempe    4       1.0
NY     Albany   1       1.0
       All              3.0
       NYC      1       1.0
                2       1.0
All    Albany   1       1.0
       All              7.0
       NYC      1       1.0
                2       1.0
       Phoenix  1       1.0
                4       2.0
       Tempe    4       1.0
dtype: float64

我希望我的输出是

State  City     Size    Count PCT
AZ     All              4.0   1
       Phoenix  1       1.0   .25
                4       2.0   .5
       Tempe    4       1.0   .25
NY     All              3.0   1
       Albany   1       1.0   .333   
       NYC      1       1.0   .333
                2       1.0   .333

我正在考虑尝试迭代行,找到“全部”并再次迭代以创建一个包含结果的系列,但必须有一种更简单/更高效的方法来实现这一点。谢谢!

最佳答案

test = test.to_frame()
test['PCT'] = test.groupby(level=0).transform(lambda x: x/x.max())

输出:

                      0       PCT
State City    Size               
AZ    Phoenix 1     1.0  0.250000
              4     2.0  0.500000
      Tempe   4     1.0  0.250000
      All           4.0  1.000000
NY    Albany  1     1.0  0.333333
      NYC     1     1.0  0.333333
              2     1.0  0.333333
      All           3.0  1.000000
All   Albany  1     1.0  0.142857
      NYC     1     1.0  0.142857
      Phoenix 1     1.0  0.142857
      NYC     2     1.0  0.142857
      Phoenix 4     2.0  0.285714
      Tempe   4     1.0  0.142857
      All           7.0  1.000000

关于python - 从 Pandas 数据透视表中的小计中获取总数的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44163253/

相关文章:

python - 如何在 python Flask 中验证 html 表单?

Python - 将括号之间的内容读取为单个 'block'

python - Pandas.read_csv(,parse_dates,) 强制将一列 float 据变成字符串

python - 为所有行创建具有相同元组值的列

python - 如果字符串存在于由一个或多个单词动态组成的字典键中,如何将字符串添加到列表中

python - 解析转发的电子邮件

python - 创建新列来比较 pandas 数据框中的行

python - 基于另一列在列中的单元格上运行函数

python - 求和所有可能对的有效方法

python - 无法弄清楚如何写入 csv