如何在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值, 出现次数)的元组列表,并按出现次数降序排序;若次数相同,则按值升序排序,最终得到如下结果:
| A | data1_count | data2_nunique | data2_create_set |
|---|---|---|---|
| 2023-07-01 | 6 | 3 | [(X, 3), (Y, 2), (Z, 1)] |
| 2023-07-02 | 5 | 4 | [(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
相关产品推荐
相关产品推荐

