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

如何在Python中升级分组聚合函数,统计分组数据出现次数并排序

问题描述

原始数据

data = {
    'A': ['2023-07-01'] * 6 + ['2023-07-02'] * 5,
    'data1': ['abnormal'] * 11,
    'data2': ['X', 'X', 'X', 'Y', 'Y', 'Z', 'X', 'Y', 'Z', 'Z', 'A'],
    'Data3': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110],
    'Data4': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k']
}

现有聚合代码

已通过groupby('A')实现记录计数、去重计数和去重排序值,代码如下:

import pandas as pd

def create_set_ori(x):
    return sorted(set(x))

df = pd.DataFrame(data)
result = df.groupby(['A']).agg({
    'data1': 'count',
    'data2': [pd.Series.nunique, create_set_ori]
}).reset_index()

result.columns = ['_'.join(col).strip() for col in result.columns.values]

需求升级

希望修改create_set_ori函数,使其统计data2中各值的出现次数,返回形如(data2值, 出现次数)的元组列表,并按出现次数降序排序;若次数相同,则按值升序排序,最终得到如下结果:

Adata1_countdata2_nuniquedata2_create_set
2023-07-0163[(X, 3), (Y, 2), (Z, 1)]
2023-07-0254[(Z, 2), (X, 1), (Y, 1), (A, 1)]
解决方案

修改create_set_ori函数,利用pandas.Series.value_counts()统计频次,再通过排序和类型转换得到目标格式:

import pandas as pd

def create_set_ori(x):
    # 先按出现次数降序,次数相同则按值升序排序
    count_result = x.value_counts().sort_values(ascending=[False, True])
    # 将索引(data2值)和频次值打包成元组列表
    return list(zip(count_result.index, count_result.values))

df = pd.DataFrame(data)
result = df.groupby(['A']).agg({
    'data1': 'count',
    'data2': [pd.Series.nunique, create_set_ori]
}).reset_index()

result.columns = ['_'.join(col).strip() for col in result.columns.values]

# 输出结果
print(result)

运行结果

执行上述代码后,输出结果如下:

A  data1_count  data2_nunique               data2_create_set
0  2023-07-01            6              3        [(X, 3), (Y, 2), (Z, 1)]
1  2023-07-02            5              4  [(Z, 2), (X, 1), (Y, 1), (A, 1)]

内容的提问来源于stack exchange,提问作者Krit Pattamadit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:42:51