其他
Clumper库 | Groupby具体案例用法
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()