Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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 基于group by之后每组中最后一个值的内容的列的总和和计数_Python_Pandas_Pandas Groupby - Fatal编程技术网

Python 基于group by之后每组中最后一个值的内容的列的总和和计数

Python 基于group by之后每组中最后一个值的内容的列的总和和计数,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个如下的数据帧 id val type aa 0 C aa 1 T aa 2 T aa 3 T aa 0 M aa 1 M aa 2 C aa 3 M bbb 0 C bbb 1 T bbb 2 T bbb 3 T bb

我有一个如下的数据帧

id       val    type
aa         0    C
aa         1    T
aa         2    T
aa         3    T
aa         0    M
aa         1    M
aa         2    C
aa         3    M
bbb        0    C
bbb        1    T
bbb        2    T
bbb        3    T
bbb        0    M
bbb        1    M
bbb        2    C
bbb        3    T
cccccc     0    C
cccccc     1    T
cccccc     2    T
cccccc     3    T
cccccc     0    M
cccccc     1    M
cccccc     0    C
cccccc     1    C
我想做一个groupby ID,然后对column val中的行进行求和和和计数,但是应该求和的行只是包含与每个组中column type的最后一个值相同类型的行

例如,组的最后一行的类型为M,因此只能对组中类型为M的行进行求和和和计数。因此,值0、1和3需要求和&计数为3

上述df的预期输出如下所示。输出中的列类型不是强制性的,如果需要更多时间才能获得,则可以将其忽略。我在这里展示它只是为了明确我想要实现的目标

id     val  count   type
aa       4  3       M
bbb      9  4       T
cccccc   1  3       C

与last一起使用进行过滤,然后按命名聚合进行聚合,适用于0.25+:

df = (df[df['type'].eq(df.groupby('id')['type'].transform('last'))]
            .groupby('id').agg(val=('val', 'sum'), 
                               count=('val', 'size'), 
                               type=('type','last')))
print (df)
        val  count type
id                     
aa        4      3    M
bbb       9      4    T
cccccc    1      3    C
另一个解决方案,其by Series由和创建:

与last一起使用进行过滤,然后按命名聚合进行聚合,适用于0.25+:

df = (df[df['type'].eq(df.groupby('id')['type'].transform('last'))]
            .groupby('id').agg(val=('val', 'sum'), 
                               count=('val', 'size'), 
                               type=('type','last')))
print (df)
        val  count type
id                     
aa        4      3    M
bbb       9      4    T
cccccc    1      3    C
另一个解决方案,其by Series由和创建:

输出

       id type  val  count
0      aa    M    4      3
1     bbb    T    9      4
2  cccccc    C    1      3
输出

       id type  val  count
0      aa    M    4      3
1     bbb    T    9      4
2  cccccc    C    1      3

我想到了布尔索引,但没有想到转换“last”后的布尔索引。谢谢。我想到了布尔索引,但没有想到转换“last”后的布尔索引。谢谢