首页 > 解决方案 > 在 Pandas 中,如何减少行数以便只接受某个子组最大值的行?

问题描述

a  1
a  2
a  3
b  3
b  4
a  3
b  5
b  6
b  4
b  10
b  11
a  10
b  2
b  3

忽略 a 直到 b 发生变化。只考虑 a 更改为 b 的组,并获得该组的最大值?

最终输出

    a  1
    a  2
    a  3
    b  4
    b  11
    a  10

即 b 是第一组的最大值 b 是第二组的最大值 a 是第三组的最大值

标签: pythonpandas

解决方案


使用shiftand cumsumwitheq创建组键,然后使用groupby sort_values+tail

m=(df.C1.shift().ne(df.C1)&df.C1.eq('a')).cumsum()
df.sort_values('C2').groupby(m).tail(1)
Out[62]: 
   C1  C2
4   b   4
11  a  10
10  b  11

然后我们结合第一组所有 C1 值都是 'a' 使用concat

s1=df.sort_values('C2').groupby(m).tail(1)
s2=df.loc[(df.C1=='a')&(m==1)]
pd.concat([s1,s2]).sort_index()
Out[71]: 
   C1  C2
0   a   1
1   a   2
2   a   3
4   b   4
10  b  11
11  a  10

推荐阅读