你可以使用group by:
c_maxes = df.groupby(['A', 'B']).C.transform(max)
df = df[df.C == c_maxes]
c_maxes是每组中C的最大值的一系列,但长度相同且与df相同的索引.如果你没有使用.transform,那么打印c_max可能是一个好主意,看看它是如何工作的.
使用drop_duplicates的另一种方法是
df.sort('C').drop_duplicates(subset=['A', 'B'], take_last=True)
不知道哪个更有效率,但我猜是第一种方法,因为它不涉及排序.
编辑:
从pandas 0.18 up第二个解决方案将是df.sort_values(‘C’).drop_duplicates(subset = [‘A’,’B’],keep =’last’)或者替代地,df.sort_values(‘C’ ascending = False).drop_duplicates(subset = [‘A’,’B’]).无论如何,groupby解决方案似乎表现得更好:
%timeit -n 10 df[df.groupby(['A', 'B']).C.max == df.C]
10 loops, best of 3: 25.7 ms per loop
%timeit -n 10 df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last')
10 loops, best of 3: 101 ms per loop