查看原文
其他

Clumper库 | Groupby具体案例用法

大邓 大邓和他的Python 2022-07-09

2021暑期 | 结构模型、Stata实证前沿、Python数据挖掘暑假工作坊


Clumper前期文章


Agg

聚合描述性统计方法

agg如下图,可以理解成三个步骤,即group->split->summary

常用的描述性统计函数有:mean、count、unqiue、n_unique、sum、min和max

求学生的平均成绩、最优和最差成绩

from clumper import Clumper

grade_dicts = [{'gender''男''grade'98'name''张三'},    
               {'gender''女''grade'88'name''王五'},    
               {'gender''女''grade'99'name''赵六'},    
               {'gender''男''grade'58'name''李四'}]

(Clumper(grade_dicts) 
 .agg(mean_grade=('grade''mean'),      
      max_grade=('grade''max'),      
      min_grade=('grade''min')) 
 .collect()
)
[{'mean_grade': 85.75, 'max_grade': 99, 'min_grade': 58}]

求男生和女生各自的平均成绩、最优和最差成绩

from clumper import Clumper

grade_dicts = [{'gender''男''grade'98'name''张三'},    
               {'gender''女''grade'88'name''王五'},    
               {'gender''女''grade'99'name''赵六'},    
               {'gender''男''grade'58'name''李四'}]

(Clumper(grade_dicts) 
 .group_by('gender'
 .agg(mean_grade=('grade''mean'),      
      max_grade=('grade''max'),      
      min_grade=('grade''min')) 
 .collect())
[{'gender': '男', 'mean_grade': 78, 'max_grade': 98, 'min_grade': 58},
{'gender': '女', 'mean_grade': 93.5, 'max_grade': 99, 'min_grade': 88}]

Collect

一般Clumper函数返回的结果显示为Clumper类,是看不到具体内容的。

collect作用主要是展开显示。


剔除重复

剔除重复内容

from clumper import Clumper
data = [{"a"1}, {"a"2}, {"a"2}]

(Clumper(data) 
 .drop_duplicates() 
 .collect() 
)
[{'a': 1}, {'a': 2}]

什么是Group?

from clumper import Clumper

list_dicts = [
    {'a'6'grp''a'},
    {'a'2'grp''b'},
    {'a'7'grp''a'},
    {'a'9'grp''b'},
    {'a'5'grp''a'}
]

(Clumper(list_dicts)
  .group_by('grp')
)
<Clumper groups=('grp',) len=5 @0x103cb0290>

当前的group以grp作为关键词

现在经过 .group_by('grp')操作后,说明你对每个grp组感兴趣。具体一点,一个组是{'grp': 'a'}, 另一个组是{'grp': 'b'}.


Agg

without groups

from clumper import Clumper

list_dicts = [
    {'a'6'grp''a'},
    {'a'2'grp''b'},
    {'a'7'grp''a'},
    {'a'9'grp''b'},
    {'a'5'grp''a'}
]

(Clumper(list_dicts)
  .agg(s=('a''sum'),
       m=('a''mean'))
  .collect())
[{'s': 29, 'm': 5.8}]

with groups

分别计算组grp=a、组grp=b的sum和mean

from clumper import Clumper

list_dicts = [
    {'a'6'grp''a'},
    {'a'2'grp''b'},
    {'a'7'grp''a'},
    {'a'9'grp''b'},
    {'a'5'grp''a'}
]

(Clumper(list_dicts)
  .group_by('grp')
  .agg(s=('a''sum'),
       m=('a''mean'))
  .collect())
[{'grp': 'a', 's': 18, 'm': 6},
{'grp': 'b', 's': 11, 'm': 5.5}]

agg内置的统计函数名

内置的统计函数,可直接通过字符串调用

{
  "mean": mean,
  "count"lambda d: len(d),
  "unique"lambda d: list(set(d)),
  "n_unique"lambda d: len(set(d)),
  "sum": sum,
  "min": min,
  "max": max,
  "median": median,
  "var": variance,
  "std": stdev,
  "values"lambda d: d,
  "first"lambda d: d[0],
  "last"lambda d: d[-1],
}

Transform

.transform().agg()类似。主要的区别是transform处理过程中,记录数和字段数不会出现压缩。

without groups

from clumper import Clumper

data = [{"a"6"grp""a"},    
        {"a"2"grp""b"},    
        {"a"7"grp""a"},    
        {"a"9"grp""b"},    
        {"a"5"grp""a"}]

(Clumper(data) 
 .transform(s=("a""sum"),            
            u=("a""unique")) 
 .collect())
[{'a': 6, 'grp': 'a', 's': 29, 'u': [2, 5, 6, 7, 9]},
{'a': 2, 'grp': 'b', 's': 29, 'u': [2, 5, 6, 7, 9]},
{'a': 7, 'grp': 'a', 's': 29, 'u': [2, 5, 6, 7, 9]},
{'a': 9, 'grp': 'b', 's': 29, 'u': [2, 5, 6, 7, 9]},
{'a': 5, 'grp': 'a', 's': 29, 'u': [2, 5, 6, 7, 9]}]

with groups

from clumper import Clumper

data = [
    {"a"6"grp""a"},
    {"a"2"grp""b"},
    {"a"7"grp""a"},
    {"a"9"grp""b"},
    {"a"5"grp""a"}
]

(Clumper(data)
 .group_by("grp")
 .transform(s=("a""sum"),
            u=("a""unique"))
 .collect()
)
[{'a': 6, 'grp': 'a', 's': 18, 'u': [5, 6, 7]},
{'a': 7, 'grp': 'a', 's': 18, 'u': [5, 6, 7]},
{'a': 5, 'grp': 'a', 's': 18, 'u': [5, 6, 7]},
{'a': 2, 'grp': 'b', 's': 11, 'u': [9, 2]},
{'a': 9, 'grp': 'b', 's': 11, 'u': [9, 2]}]

Mutate

clumper库中的row_number可以给每条记录显示索引位置(第几个)。

without groups

from clumper import Clumper
from clumper.sequence import row_number

list_dicts = [
    {'a'6'grp''a'},
    {'a'2'grp''b'},
    {'a'7'grp''a'},
    {'a'4'grp''b'},
    {'a'5'grp''a'}
]

(Clumper(list_dicts)
  .mutate(index=row_number())
  .collect()
)
[{'a': 6, 'grp': 'a', 'index': 1},
{'a': 2, 'grp': 'b', 'index': 2},
{'a': 7, 'grp': 'a', 'index': 3},
{'a': 4, 'grp': 'b', 'index': 4},
{'a': 5, 'grp': 'a', 'index': 5}]

with groups

from clumper import Clumper
from clumper.sequence import row_number

list_dicts = [
    {'a'6'grp''a'},
    {'a'2'grp''b'},
    {'a'7'grp''a'},
    {'a'4'grp''b'},
    {'a'5'grp''a'}
]

(Clumper(list_dicts)
  .group_by('grp')
  .mutate(index=row_number())
  .collect()
)
[{'a': 6, 'grp': 'a', 'index': 1},
{'a': 7, 'grp': 'a', 'index': 2},
{'a': 5, 'grp': 'a', 'index': 3},
{'a': 2, 'grp': 'b', 'index': 1},
{'a': 4, 'grp': 'b', 'index': 2}]

Sort

排序, 默认升序

without groups

from clumper import Clumper

list_dicts = [{'a'6'grp''a'},    
              {'a'2'grp''b'},    
              {'a'7'grp''a'},    
              {'a'9'grp''b'},    
              {'a'5'grp''a'}]

(Clumper(list_dicts) #根据字段a进行排序  
 .sort(key=lambda d: d['a'])  
 .collect())
[{'a': 2, 'grp': 'b'},
{'a': 5, 'grp': 'a'},
{'a': 6, 'grp': 'a'},
{'a': 7, 'grp': 'a'},
{'a': 9, 'grp': 'b'}]

with groups

from clumper import Clumper

list_dicts = [{'a'6'grp''a'},    
              {'a'2'grp''b'},    
              {'a'7'grp''a'},    
              {'a'9'grp''b'},    
              {'a'5'grp''a'}]

(Clumper(list_dicts)  
 .group_by('grp')  
 .sort(key=lambda d: d['a'])  
 .collect())
[{'a': 5, 'grp': 'a'},
{'a': 6, 'grp': 'a'},
{'a': 7, 'grp': 'a'},
{'a': 2, 'grp': 'b'},
{'a': 9, 'grp': 'b'}]

Ungroup

最后,如果你已经进行完了分组计算,想再次整合起来,取消分组状态,可以使用.ungroup()

精选文章

腾讯课堂 | Python网络爬虫与文本分析
B站视频 | Python自动化办公
语法最简单的微博通用爬虫weibo_crawler
发布一个智能解析算法库
hiResearch 定义自己的科研首页
大邓github汇总, 觉得有用记得star
multistop ~ 多语言停用词库
Jaal 库 轻松绘制动态社交网络关系图
SciencePlots | 科研样式绘图库
使用streamlit上线中文文本分析网站
爬虫实战 | 采集&可视化知乎问题的回答
Clumper | dplyr式的Python数据操作包
plydata库 | 数据操作管道操作符>>
plotnine: Python版的ggplot2作图库
读完本文你就了解什么是文本分析
文本分析在经管领域中的应用概述  
综述:文本分析在市场营销研究中的应用
plotnine: Python版的ggplot2作图库
Wow~70G上市公司定期报告数据集
漂亮~pandas可以无缝衔接Bokeh  
YelpDaset: 酒店管理类数据集10+G 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存