Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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 基于列值对dataframe的子集执行计算_Python_Pandas - Fatal编程技术网

Python 基于列值对dataframe的子集执行计算

Python 基于列值对dataframe的子集执行计算,python,pandas,Python,Pandas,我有一个df,其中我有一个分类列,然后是各种数值列-我需要计算各种值,但在df的子集上,类别是相同的: Type | num1 | num2 a | 10 | 10 a | 5 | 10 a | 1 | 30 b | 5 | 10 ... 在这里,我想计算每个值占该类型总数的百分比 因此,输出将是: Type | num1 | num2 | num2_pct a | 10 | 10 | 20 a | 5 | 10

我有一个df,其中我有一个分类列,然后是各种数值列-我需要计算各种值,但在df的子集上,类别是相同的:

Type | num1 | num2
 a   | 10   | 10 
 a   | 5    | 10
 a   | 1    | 30 
 b   | 5    | 10
...
在这里,我想计算每个值占该类型总数的百分比

因此,输出将是:

Type | num1 | num2 | num2_pct
 a   | 10   | 10   | 20
 a   | 5    | 10   | 20
 a   | 1    | 30   | 60
...
此计算将针对
类型
列中的每个值进行


我曾尝试使用
df.loc
编写一个循环,创建一个新的df,然后合并它们-但这不是正确的方法

您可以单独运行,也可以使用管道获得结果:

#pipe

df["num1_pct"] = (df.groupby("Type")
                    .pipe(lambda x: x.num2.transform(lambda x: x).div(x.num2.transform("sum")).mul(100)))

       Type num1    num2    num1_pct
   0    a   10      10      20.0
   1    a   5       10      20.0
   2    a   1       30      60.0
   3    b   5      10       100.0

#individually, and in my own opinion, cleaner : 

grouping = df.groupby("Type")

df["num2_pct"] = df.num2 * 100 / grouping.num2.transform("sum")

num1_pct看起来更像是基于num2列的计算值。您能解释一下第二个版本吗?我很难理解它是如何工作的,因为分组的形状不同?转换确保为每一行复制聚合。单独尝试分组,您将看到它给出的[50,50,50,10]与行数匹配,相当于每个组的num2之和。