You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:如何删除所有Name列全为空的ID对应的行

Pandas:按ID保留存在非空Name的所有行

问题说明

现有DataFrame:

IDName
1NaN
1Banana
1NaN
2NaN
2NaN
2NaN
3Apple
3NaN

需求:删除所有Name列全为NaN的ID对应的行;保留至少有一个非空Name的ID的所有行。期望输出:

IDName
1NaN
1Banana
1NaN
3Apple
3NaN

你尝试的代码逻辑有误,无法实现需求:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 09:55:10