A 1 A 2 3 0 A 3 2 <1>B 1 1 B 2 4 B 3 3 <1>B 4 2 C 1 C 2 4 C 3 3 C 4 2 D 1 1 >0D 2 4 D 3 D 4 2 //tr>
假设现在我有一些组数据,比如
分组ID如果目标不是1
,则替换Series.where
中的Rank
,然后使用GroupBy.transform
获得每组的最大Rank
,因此可以将boolean indexing
中的Rank
列与Series.le
进行比较以获得更小或相等的值:
s = df['Rank'].where(df['target'].eq(1)).groupby(df['GroupID']).transform('max')
df = df[df['Rank'].le(s)]
print (df)
GroupID ID Rank target
0 A 1 1 0
2 A 3 2 1
3 B 1 1 0
5 B 3 3 1
6 B 4 2 0
7 C 1 1 1
9 C 3 3 1
10 C 4 2 0
详细信息:
print (df['Rank'].where(df['target'].eq(1)))
0 NaN
1 NaN
2 2.0
3 NaN
4 NaN
5 3.0
6 NaN
7 1.0
8 NaN
9 3.0
10 NaN
Name: Rank, dtype: float64
print (s)
0 2.0
1 2.0
2 2.0
3 3.0
4 3.0
5 3.0
6 3.0
7 3.0
8 3.0
9 3.0
10 3.0
Name: Rank, dtype: float64
IIUC,第一次对target==1的行进行切片(使用eq
(,然后使用GroupBy.max
获得每组的最大秩,并使用le
:使用经典布尔索引选择每组具有该最大秩的行
thresh = df[df['target'].eq(1)].groupby('GroupID')['Rank'].max()
out = df[df['Rank'].le(df['GroupID'].map(thresh))]
输出:
GroupID ID Rank target
0 A 1 1 0
2 A 3 2 1
3 B 1 1 0
5 B 3 3 1
6 B 4 2 0
7 C 1 1 1
9 C 3 3 1
10 C 4 2 0
阈值:
>>> thresh
GroupID
A 2
B 3
C 3