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)
输出结果(符合期望):
| number | count |
|---|---|
| 1 | 2 |
| 2 | 1 |
| 3 | 1 |
| 1 | 2 |
| NaN | 2 |
| NaN | 2 |
| 4 | 1 |
示例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)
输出结果(符合期望):
| item | count |
|---|---|
| cookies | 1 |
| cake | 3 |
| brownie | 2 |
| cake | 3 |
| cake | 3 |
| brownie | 2 |
内容的提问来源于stack exchange,提问作者codingrainha
相关产品推荐
相关产品推荐

