如何快捷实现DataFrame按Level分组的差异化聚合:指定列用nunique(),其余年份列用mean()
高效实现DataFrame分组聚合的方案
嘿,这个需求太常见了——手动列几十列简直是噩梦!给你两个实用的方法,不用一个个敲列名:
方法一:按列名规律筛选年份列
如果你的2021年及以后的列名是类似2021、2022这种统一格式,直接用列表推导式提取这些列,再加上需要nunique的列构建聚合字典:
import pandas as pd # 假设你的DataFrame名为df,需要nunique的两列是'ColumnX'和'ColumnY' # 筛选2021及以后的年份列(这里假设列名以'202'开头,可根据实际调整规则) year_columns = [col for col in df.columns if col.startswith('202')] # 构建聚合规则:年份列用mean,指定列用nunique aggregation_rules = {col: 'mean' for col in year_columns} aggregation_rules.update({'ColumnX': 'nunique', 'ColumnY': 'nunique'}) # 执行分组聚合 grouped_result = df.groupby('Level').agg(aggregation_rules)
方法二:排除指定列来获取剩余列
如果年份列的命名没那么规整,或者你想直接排除不需要mean的列(也就是分组字段和需要nunique的列),可以用columns.difference()来自动获取剩余列:
# 定义不需要用mean的列:分组字段Level + 需要nunique的两列 exclude_cols = ['Level', 'ColumnX', 'ColumnY'] # 获取所有需要用mean的列 mean_columns = df.columns.difference(exclude_cols) # 构建聚合规则 aggregation_rules = {col: 'mean' for col in mean_columns} aggregation_rules.update({'ColumnX': 'nunique', 'ColumnY': 'nunique'}) # 分组聚合 grouped_result = df.groupby('Level').agg(aggregation_rules)
这两种方法都能帮你省去手动列60多列的麻烦,根据你的列名实际情况选就行~
内容的提问来源于stack exchange,提问作者Miriio
相关产品推荐
相关产品推荐

