如何按顺序及NaN规则筛选Pandas DataFrame行并保留组尾行
Pandas分组前筛选行:保留每组最后一行+非空Name2行
你的核心需求是删除Name2为NaN的行,但要保留每个分组的最后一行(即便该行Name2是NaN)。之前的筛选方式会一刀切删掉所有Name2为空的行,所以丢失了每组末尾的关键行,用以下方法可以解决:
实现步骤
标记每组最后一行
给DataFrame新增一个临时列,标记每行是否属于所在分组的最后一行:# 替换'Group'为你的实际分组列名(比如Name1或其他分组标识) df['is_last_row'] = df.groupby('Group').cumcount(ascending=False) == 0这里
cumcount(ascending=False)会对每个分组的行倒序计数,最后一行的计数结果为0,通过判断等于0来标记最后一行。筛选目标行
保留Name2非空或者是分组最后一行的行:df_filtered = df[(df['Name2'].notna()) | df['is_last_row']] # 可选:删除临时标记列 df_filtered = df_filtered.drop('is_last_row', axis=1)
效果说明
这种方法会自动过滤掉所有Name2为空且不是分组末尾的行,同时完整保留每个分组的最后一行,完全适配你数千行的结构化数据。
比如假设你的输入数据结构如下:
| Index | Group | Name1 | Name2 |
|---|---|---|---|
| 0 | A | Tom | Alice |
| 1 | A | Tom | NaN |
| 2 | A | Tom | Bob |
| 3 | A | Tom | NaN |
| 4 | B | Jane | Dave |
| 5 | B | Jane | NaN |
| 6 | B | Jane | Eve |
| 7 | B | Jane | NaN |
筛选后输出会是:
| Index | Group | Name1 | Name2 |
|---|---|---|---|
| 0 | A | Tom | Alice |
| 2 | A | Tom | Bob |
| 3 | A | Tom | NaN |
| 4 | B | Jane | Dave |
| 6 | B | Jane | Eve |
| 7 | B | Jane | NaN |
内容的提问来源于stack exchange,提问作者chrundle
相关产品推荐
相关产品推荐

