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

Python Pandas分组统计时如何包含NaN/None的计数?

问题与解决方案

需求

需要自定义函数count_how_many,实现统计数据列中NaN/None、数字、字符串等各类值的出现次数。原函数使用groupby结合transform('count')无法统计NaN值,默认groupby逻辑会排除NaN分组,导致无法统计其出现次数。

原函数代码

def count_how_many(df: pd.DataFrame,in_col, out_col, inplace=False):
    def count_occurrences(dff: pd.DataFrame) -> pd.DataFrame:
        return dff.groupby(in_col)[in_col].transform('count')
    if not inplace:
        copy_df = df.copy()
        copy_df[out_col] = count_occurrences(copy_df)
        return copy_df
    else:
        df[out_col] = count_occurrences(df)
        return None

修改后的函数

核心修改点:

  • groupby时设置dropna=False,强制保留NaN作为分组项
  • 用transform('size')替代transform('count'),size会统计每组的所有行数(包含NaN),而count仅统计非缺失值行数
import pandas as pd
import numpy as np

def count_how_many(df: pd.DataFrame,in_col, out_col, inplace=False):
    def count_occurrences(dff: pd.DataFrame) -> pd.DataFrame:
        # 关键修改:保留NaN分组,统计全组行数
        return dff.groupby(in_col, dropna=False)[in_col].transform('size')
    if not inplace:
        copy_df = df.copy()
        copy_df[out_col] = count_occurrences(copy_df)
        return copy_df
    else:
        df[out_col] = count_occurrences(df)
        return None

示例验证

示例1:含NaN的数值型数据df1

输入数据:

number
1
2
3
1
np.nan
np.nan
4

执行代码:

df1 = pd.DataFrame({'number': [1,2,3,1,np.nan,np.nan,4]})
result_df1 = count_how_many(df1, 'number', 'count')
print(result_df1)

输出结果(符合期望):

numbercount
12
21
31
12
NaN2
NaN2
41

示例2:字符串型数据df2

输入数据:

item
cookies
cake
brownie
cake
cake
brownie

执行代码:

df2 = pd.DataFrame({'item': ['cookies','cake','brownie','cake','cake','brownie']})
result_df2 = count_how_many(df2, 'item', 'count')
print(result_df2)

输出结果(符合期望):

itemcount
cookies1
cake3
brownie2
cake3
cake3
brownie2

内容的提问来源于stack exchange,提问作者codingrainha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:01:02