Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pandas中的groupby根据另一列中的标准计算百分比/总比例_Python_Pandas_Dataframe_Group By_Pivot - Fatal编程技术网

Python 如何使用pandas中的groupby根据另一列中的标准计算百分比/总比例

Python 如何使用pandas中的groupby根据另一列中的标准计算百分比/总比例,python,pandas,dataframe,group-by,pivot,Python,Pandas,Dataframe,Group By,Pivot,我正在尝试解决如何使用pandas中的groupby函数,在给定的是/否标准下计算出每年的值的比例 例如,我有一个名为names的数据帧: Name Number Year Sex Criteria 0 name1 789 1998 Male N 1 name1 688 1999 Male N 2 name1 639 2000 Male N 3 name2 551 1998 Male Y

我正在尝试解决如何使用pandas中的
groupby
函数,在给定的是/否标准下计算出每年的值的比例

例如,我有一个名为
names
的数据帧:

  Name  Number  Year   Sex Criteria
0  name1     789  1998  Male      N
1  name1     688  1999  Male      N
2  name1     639  2000  Male      N
3  name2     551  1998  Male      Y
4  name2     499  1999  Male      Y
我可以用

namesgrouped = names.groupby(["Sex", "Year", "Criteria"]).sum()
要获得:

                   Number
Sex    Year      Criteria
Male   1998 N        14507
            Y         2308
       1999 N        14119
            Y         2331
等等。我想在“数字标准”栏中显示每个性别和年份在总数中所占的百分比——因此,我选择了N=86.27%和Y=13.73%,而不是1998年的N=14507和Y=2308


有人能给我们建议怎么做吗?

这个问题是这个问题的直接延伸。借用公认的答案,这将起作用:

In [46]: namesgrouped.groupby(level=[0, 1]).apply(lambda g: g / g.sum())
Out[46]: 
                      Number
Sex  Year Criteria          
Male 1998 N         0.588806
          Y         0.411194
     1999 N         0.579612
          Y         0.420388
     2000 N         1.000000

编辑:变换操作可能比应用更快:

namesgrouped / namesgrouped.groupby(level=[0, 1]).transform('sum')

不幸的是,您链接到的示例的可能副本对我不起作用,因为我在groupby中有一个额外的层!有人知道在处理像我这样的层次结构时如何计算百分比吗?我有没有一种方法可以在不应用
apply
的情况下实现相同的百分比?@NelsonGon可以尝试类似
namesgrouped.div(namesgrouped.groupby(level=[0,1]).transform('sum')
的方法,你能把它添加到你的答案中吗?我见过transform使用了很多,但不确定它是如何工作的。你能详细说明一下transform的作用吗?我看到python和R有很多相似的函数,但R的转换行为可能与我在这里看到的有所不同。@NelsonGon
GroupBy.transform
GroupBy
操作的结果扩展到原始数据帧的整个长度。例如,这里没有为每个组汇总总和的结果,
transform
意味着(相同的)总和将扩展到整个组。这就是我们如何用它的总和来划分每一组。谢谢,那么用总和来转换是如何给我们比例的呢?对不起,我几个小时前就试过了,结果不太理想。