如何在pandas数据帧中按组筛选行



假设现在我有一些组数据,比如

分组IDA1A230A32<1>B11B24B33<1>B42C1C24C33C42D11>0D24D3D42//tr>

如果目标不是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

最新更新