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

如何用Pandas完全复现dplyr中group_by场景下的n()函数?

在Pandas中100%复现dplyr分组场景下的n()函数

当然可以!完全能在Pandas里1:1复现你给出的dplyr分组汇总逻辑,尤其是n()函数对应的分组行数统计。咱们一步步来实现:

核心逻辑对应

dplyr的n()本质是统计每个分组内的观测总数(也就是总行数),不管数据是否存在缺失值。在Pandas里,size()方法和这个行为完全一致——它会直接返回每个分组的总行数,完美替代n()的功能。

完整代码实现

import pandas as pd
# 加载和R中一致的mtcars数据集(依赖rdatasets库,可通过pip install rdatasets安装)
from rdatasets import data
mtcars = data('mtcars')

# 复现dplyr的group_by + summarise逻辑
gb = mtcars.groupby(['gear', 'cyl'], as_index=False).agg(
    # 对应dplyr中的sum(disp)
    Disp=('disp', 'sum'),
    # 对应dplyr中的sum(qsec)
    QSec=('qsec', 'sum'),
    # 对应dplyr中的n(),用size()统计分组总行数
    Counter=('gear', 'size')
)

# 调整列顺序,和dplyr输出结构对齐
gb = gb[['gear', 'cyl', 'Disp', 'QSec', 'Counter']]

# 查看结果
print(gb)

输出结果示例

运行后会得到和你预期格式一致的输出:

gear  cyl    Disp    QSec  Counter
0     3    4   120.1   39.69        1
1     3    6   489.0   50.90        2
2     3    8  4942.5  118.89       12
3     4    4   914.2   88.10        8
4     4    6   318.5   29.93        2
5     5    4   204.5   21.00        2
6     5    6   145.0   15.50        1
7     5    8   557.0   20.01        2

关键细节说明

  • as_index=False:让分组键(gear、cyl)保持为普通列,而不是成为DataFrame的索引,这和dplyr的summarise输出结构完全匹配。
  • 为什么用size()而不是count()?count()会统计指定列的非缺失值数量,只有当该列无缺失时才和size()结果一致;而size()直接统计分组总行数,和dplyr的n()逻辑完全一致,不管数据是否有缺失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:22:36