Pandas:如何删除所有Name列全为空的ID对应的行
Pandas:按ID保留存在非空Name的所有行
问题说明
现有DataFrame:
| ID | Name |
|---|---|
| 1 | NaN |
| 1 | Banana |
| 1 | NaN |
| 2 | NaN |
| 2 | NaN |
| 2 | NaN |
| 3 | Apple |
| 3 | NaN |
需求:删除所有Name列全为NaN的ID对应的行;保留至少有一个非空Name的ID的所有行。期望输出:
| ID | Name |
|---|---|
| 1 | NaN |
| 1 | Banana |
| 1 | NaN |
| 3 | Apple |
| 3 | NaN |
你尝试的代码逻辑有误,无法实现需求:
df = df[(df['ID']) & (df['Name'].isna().sum()) != 0]
错误原因
df['ID']直接作为布尔条件会将ID数值转为布尔值(非0即True),没有按ID分组判断df['Name'].isna().sum()计算的是整个列的NaN总数,无法区分不同ID的分组情况
正确实现
方法1:先筛选有效ID再过滤
先按ID分组,判断每个组是否存在非空Name,再提取符合条件的ID来过滤原数据:
# 获取所有存在非空Name的ID valid_ids = df.groupby('ID')['Name'].filter(lambda x: x.notna().any()).unique() # 过滤原DataFrame df = df[df['ID'].isin(valid_ids)]
方法2:用transform直接标记过滤
更简洁的写法,用transform给每一行标记所属ID是否符合条件,直接过滤:
df = df[df.groupby('ID')['Name'].transform(lambda x: x.notna().any())]
两种方法都会得到你想要的结果:删除ID为2的所有行,保留ID1和3的全部行。
内容的提问来源于stack exchange,提问作者D.Doe
相关产品推荐
相关产品推荐

