设置as_index=False时Pandas groupby的count方法失效问题
count()与size()在pandas groupby中的行为差异 问题场景
当对仅含word列的DataFrame执行groupby('word', as_index=False).count()时,仅返回分组后的word列,无计数结果;而使用.size()则能得到每个分组的行数统计:
示例代码(count())
import pandas as pd word_list = ['a', 'b', 'c', 'a', 'c', 'c', 'b', 'a', 'c'] df = pd.DataFrame(word_list, columns=['word']) as_counts = df.groupby('word', as_index=False).count() print(as_counts)
输出:
word 0 a 1 b 2 c
示例代码(size())
as_counts = df.groupby('word', as_index=False).size() print(as_counts)
输出:
word size 0 a 3 1 b 2 2 c 4
核心差异解析
1. 统计目标不同
size():直接统计每个分组的总行数,不管数据是否有缺失,是纯粹的分组行数计数。只要执行分组,它就会生成包含分组键和对应行数的结果,不受原DataFrame列数影响。count():统计的是每个分组中,各非分组列的非缺失值数量。如果你的DataFrame只有分组键这一列(即没有其他可统计的列),count()就没有额外的列可以生成计数结果,最终只会保留分组键列。
2. 结果生成逻辑不同
当设置as_index=False时,分组键会被保留为结果DataFrame的普通列:
- 对于
size():它会在保留分组键列的基础上,新增一列size来存储分组行数。 - 对于
count():它会遍历所有非分组列统计非缺失值,但如果没有非分组列,就只会返回分组键列,没有计数数据。
3. 缺失值处理不同
size()不区分缺失值,只要是分组内的行都会被计数。count()会跳过缺失值,只统计各列中不为NaN的条目数。如果DataFrame有其他列但存在缺失值,count()的结果会比size()小。
举个例子,给原DataFrame新增含缺失值的列后:
df['num'] = [1, None, 3, 4, None, 6, 7, 8, None] print(df.groupby('word', as_index=False).count())
输出:
word num 0 a 3 1 b 1 2 c 2
这里num列的计数就是每个分组中非缺失值的数量,而size()仍会返回每个分组的总行数。
内容的提问来源于stack exchange,提问作者David Tejuosho
相关产品推荐
相关产品推荐

