如何在Pandas DataFrame中按分组统计零值与非零值数量?
Pandas实现按语言分组统计零值/非零值数量
首先构造示例数据集:
import pandas as pd data = { 'docs': ['example 1', 'example 2', 'example 3', 'example 4', 'example 5', 'example 6'], 'language': ['python', 'JS', 'python', 'JS', 'python', 'JS'], 'instance': [25, 15, 0, 34, 0, 0] } df = pd.DataFrame(data)
统计零值数量
有两种简洁的实现方式:
- 先筛选出
instance为0的行,再按language分组统计数量:
zero_counts = df[df['instance'] == 0].groupby('language').size().reset_index(name='zero count')
- 直接分组后,对每组的
instance列统计等于0的元素个数:
zero_counts = df.groupby('language')['instance'].apply(lambda x: (x == 0).sum()).reset_index(name='zero count')
输出结果:
language zero count 0 JS 1 1 python 2
统计非零值数量
同理,两种实现方式:
- 先筛选
instance非零的行再分组:
non_zero_counts = df[df['instance'] != 0].groupby('language').size().reset_index(name='non-zero count')
- 分组后统计非零元素个数:
non_zero_counts = df.groupby('language')['instance'].apply(lambda x: (x != 0).sum()).reset_index(name='non-zero count')
输出结果:
language non-zero count 0 JS 2 1 python 1
更高效的一次性统计
如果需要同时获取两种统计结果,可以用agg方法一次性计算,再拆分出所需的DataFrame:
stats_df = df.groupby('language')['instance'].agg( zero_count=lambda x: (x == 0).sum(), non_zero_count=lambda x: (x != 0).sum() ).reset_index() # 拆分零值统计DataFrame zero_counts = stats_df[['language', 'zero_count']].rename(columns={'zero_count': 'zero count'}) # 拆分非零值统计DataFrame non_zero_counts = stats_df[['language', 'non_zero_count']].rename(columns={'non_zero_count': 'non-zero count'})
除了Pandas外,也可以结合NumPy手动实现分组统计,但Pandas的分组API已经足够简洁高效,是这类场景的首选工具。
内容的提问来源于stack exchange,提问作者Natan specialist
相关产品推荐
相关产品推荐

