如何用Python Pandas实现类似R dplyr/SQL的单语句分组汇总报表?
嗨,我完全懂这种从熟悉的工具转到新环境的困惑!你用R dplyr和SQL写的聚合逻辑很清晰,在Pandas里其实用单条groupby+agg语句就能完美实现,不用拆分多次操作。直接给你等价的代码,再帮你对应上原来的逻辑:
import pandas as pd # 假设你的原始数据框名为 df summary_df = df.groupby('x', as_index=False).agg( # 对应R: n_distinct(y[is.na(y)==F]) | SQL: count(distinct(case when y is not null then y end)) y_distinct=('y', lambda col: col.dropna().nunique()), # 对应R: n_distinct(z[is.na(z)==F]) | SQL: count(distinct(case when z is not null then z end)) z_distinct=('z', lambda col: col.dropna().nunique()), # 对应R: n() | SQL: count(1) (统计组内总行数) total=('x', 'size'), # 对应R: length(y[is.na(y)==F]) | SQL: count(case when y is not null then 1 end) y_not_missing=('y', 'count'), # 对应R: length(y[is.na(y)==T]) | SQL: count(case when y is null then 1 end) y_missing=('y', lambda col: col.isna().sum()) )
关键逻辑对应说明:
- 去重非缺失值统计:用
lambda col: col.dropna().nunique(),先过滤缺失值再统计唯一值,和你R/SQL的逻辑完全一致。 - 总行数统计:用
size而不是count——因为count会忽略列的缺失值,而size是统计组内的所有行数,完美匹配n()和count(1)的效果。 - 非缺失值计数:Pandas的
count聚合函数默认会自动忽略缺失值,直接用('y', 'count')就搞定,不用额外写判断。 - 缺失值计数:通过
col.isna()把缺失值转成布尔值,再用sum()统计True的数量(True等价于1),就是缺失值的总数。
另外,groupby里加as_index=False可以直接把分组列x保留为普通列,不用额外调用reset_index(),一步到位得到结构清晰的汇总表。
内容的提问来源于stack exchange,提问作者kamashay
相关产品推荐
相关产品推荐

