总结pandas groupby的最后一项

时间:2017-07-14 16:03:53

标签: python pandas 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

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

我认为使用last()或nth(-1)

时分组会丢失

3 个答案:

答案 0 :(得分:0)

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

返回

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

答案 1 :(得分:0)

您可以使用level=0或其他groupby添加sum作为汇总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

答案 2 :(得分:0)

您可以尝试此drop_duplicates,然后groupby

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

Out[104]: 
a
A     70
B    110