很多教程把df.groupby()写得非常复杂,咱们以一个实例,用一个比较简单的需求讲讲这东西到底怎么用。
@TOP
需求
假设拿到如下图所示Excel表,想统计“计算机”类图书一共卖了多少本。
如果直接在表中操作,怎么做?
第一步,选中B列,排序,升序或降序都无所谓,总之让相同的分类凑一起;
第二步,这里数据量少,直接拖选一下计算机这4行看状态栏就知道总共136。量多的时候可以用Excel的“分类汇总”功能,同样得到136:
一共就两步,完成任务。当然这个销量还可以再排序,没这个需求,不排也可以。
如果用Python+pandas来做,如何?
编程实现
直接上代码吧,边写边解说。
import pandas as pd
xls = "book.xls"
df = pd.DataFrame(pd.read_excel(xls))
"""
序号 分类 销量
0 1 文学 5
1 2 计算机 7
2 3 文学 89
3 4 历史 24
4 5 计算机 14
5 6 文学 6
6 7 计算机 87
7 8 地理 23
8 9 政治 17
9 10 计算机 28
"""
grouped = df.groupby(["分类"])
# 按“分类”分组,得到所有分组对象,比在Excel中直接操作少了一步提前排序
# 把df当数据库看待,“分类”字段下有重复值,筛选一下,求出不重复值:计算机、文学、政治、地理、历史,并按这些分类重新组织df
# type(grouped):<class 'pandas.core.groupby.generic.DataFrameGroupBy'>
s = grouped["销量"] # 从所有分组对象中拿出“销量”对象来
"""
# s: <pandas.core.groupby.generic.SeriesGroupBy object at 0x11A05130>
# type(s):<class 'pandas.core.groupby.generic.SeriesGroupBy'>
"""
s = s.sum() # 销量求和。基于不重复分类的各销量的和
"""<class 'pandas.core.series.Series'>
分类
历史 24
地理 23
政治 17
文学 100
计算机 136
Name: 销量, dtype: int64
"""
# Series数据类型再来个reset_index()操作就变成DataFrame类型了
df1 = s.reset_index()
"""
分类 销量
0 历史 24
1 地理 23
2 政治 17
3 文学 100
4 计算机 136
"""
# df1就是上普通df了,自然可以再用df.sort_values()排序了
# 当然不排序也可以,任务至此已基本完成!
df2 = df1.sort_values(by=["销量"])
"""
分类 销量
2 政治 17
1 地理 23
0 历史 24
3 文学 100
4 计算机 136
"""
我只想要136这个数,怎么取?
df2 = df2.set_index(["分类"])
this_number = df2.loc["计算机", "销量"] # 136
任务完成!
推荐微信公众号:apsoft2008。