如何使用Pandas按类别统计仅含NaN值的ID数量?
问题分析与解法
你的代码逻辑存在偏差,无法得到预期结果——它仅统计了每个Category中存在NaN值的ID数量,但需求是统计该ID在对应Category下所有Score均为NaN的ID数量。比如Category A中的ID1,虽然有NaN的Score记录,但同时存在有效值95,按需求不应被统计,但你的代码会将其纳入计数,导致结果错误。
正确解法
以下是两种实现预期结果的方案:
方案一:分步实现,逻辑清晰
# 1. 按(Category, ID)分组,判断每个分组的Score是否全为NaN id_full_nan = df.groupby(['Category', 'ID'])['Score'].apply(lambda x: x.isna().all()) # 2. 筛选出符合条件的记录,按Category统计ID数量 result = id_full_nan[id_full_nan].groupby('Category').size().reset_index(name='Count') # 3. 补全所有原始Category,无符合条件ID的补0 all_cats = df['Category'].unique() result = result.set_index('Category').reindex(all_cats).fillna(0).astype(int).reset_index() print(result)
方案二:链式调用,简洁高效
result = (df.groupby(['Category', 'ID']) .filter(lambda group: group['Score'].isna().all()) .groupby('Category')['ID'] .nunique() .reindex(df['Category'].unique(), fill_value=0) .reset_index(name='Count')) print(result)
结果验证
执行上述代码后,会得到你预期的结果:
| Category | Count |
|---|---|
| A | 1 |
| B | 2 |
| C | 0 |
内容的提问来源于stack exchange,提问作者CowboyCoder
相关产品推荐
相关产品推荐

