总结 pandas groupby 的最后一个条目

summing last entry from pandas groupby

我有一个如下所示的 csv。

a,b,c,d
A,A1,10,B1
A,A1,20,B1
A,A1,30,B1
A,A1,10,B4
A,A1,20,B4
A,A1,10,B5
A,A1,10,B6
B,A2,10,B7
B,A2,20,B1
B,A2,100,B1

我想取每组的最后一行并对每个 'a' 的列 c 求和。

我可以使用最后一个 .last() 但坚持按 'a' 求和,其中 a 是第一个 groupby 标准

>>> tmp.groupby(['a','b','d']).nth(-1)
           c
    a b  d      
    A A1 B1   30
         B4   20
         B5   10
         B6   10
    B A2 B1  100
         B7   10
    >>> tmp.groupby(['a','b','d']).nth(-1)['c'].sum()
    180

我需要 70(A 组总和)和 110(B 组总和)而不是 180

我认为使用 last() 或 nth(-1) 时分组会丢失

tmp.groupby(['a','b'])['c'].last()

returns

a  b 
A  A1     20
   A2    100
Name: c, dtype: int64

您可以将 sumlevel=0 或另一个 groupby 添加到第一级并汇总 sum:

df = tmp.groupby(['a','b','d'])['c'].nth(-1).sum(level=0)
print (df)
a
A     70
B    110
Name: c, dtype: int64

df = tmp.groupby(['a','b','d'])['c'].nth(-1).groupby(level=0).sum()
print (df)
a
A     70
B    110
Name: c, dtype: int64

last相同:

df = tmp.groupby(['a','b','d'])['c'].last().sum(level=0)
print (df)
a
A     70
B    110
Name: c, dtype: int64

df = tmp.groupby(['a','b','d'])['c'].last().groupby(level=0).sum()
print (df)
a
A     70
B    110
Name: c, dtype: int64

你可以试试这个 drop_duplicates 然后 groupby

df.drop_duplicates(subset=['a', 'b','d'], take_last=True).groupby('a')['c'].sum()

Out[104]: 
a
A     70
B    110