如何在Pandas中以列值为参数实现分组后指定行数筛选?
按分组保留指定行数的DataFrame处理方案
需求与原始数据
原始DataFrame:
| A | B | C |
|---|---|---|
| t | r | 1 |
| t | r | 1 |
| n | j | 2 |
| n | j | 2 |
| n | j | 2 |
需按A、B列分组,每个组保留的行数等于该组内C列的数值(组内C值一致),期望输出:
| A | B | C |
|---|---|---|
| t | r | 1 |
| n | j | 2 |
| n | j | 2 |
此前尝试的代码未成功:
df.groupby(['A', 'B']).agg(lambda x: x.head(df.C))
正确实现方法
方法1:groupby + apply
利用组内C值一致的特点,取组内第一个C值作为保留行数:
df.groupby(['A', 'B'], group_keys=False).apply(lambda group: group.head(group['C'].iloc[0]))
方法2:transform生成行号筛选
通过生成组内行号,再筛选行号不超过C值的行,性能更适合大数据集:
# 生成每个组内的行号(从1开始) df['group_row_idx'] = df.groupby(['A', 'B']).cumcount() + 1 # 筛选符合条件的行并移除辅助列 result_df = df[df['group_row_idx'] <= df['C']].drop('group_row_idx', axis=1)
内容的提问来源于stack exchange,提问作者RDGuida
相关产品推荐
相关产品推荐

