本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj
提取码:mnsj
-
前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis
根据《Python for Data Analysis 3rd Edition》翻译整理
—————————————————–
对数据集进行分类,并在每一组上应用一个聚合函数或转换函数,通常都是数据分析工作流中的一个重要部分。在加载、合并、准备数据集后,你可能需要计算分组统计,或者可能需要为报告或可视化目的就是你透视表。
1.groupby方法:
Pandas提供了一个灵活的groupby
接口,能够以一种自然的方式对数据集进行切片、切块或总结。
以一个小型的DataFrame对象为例:
1>>> df = pd.DataFrame({"key1" : ["a", "a", "b", "b", "a", "b"],
2... "key2" : pd.Series([1, 2, 1, 2, 1, 1], dtype="Int64"),
3... "data1" : [1, 2, 3, 4, 5, 6],
4... "data2" : [7, 8, 9, 10, 11, 12]})
5
6
7>>> df
8 key1 key2 data1 data2
90 a 1 1 7
101 a 2 2 8
112 b 1 3 9
123 b 2 4 10
134 a 1 5 11
145 b 1 6 12
假设你想用key1列的标签来计算data1
列的平均值,有很多方法可以做到这一点。一种是访问data1
,然后用key1的列(一个Series)调用groupby
方法。
grouped
变量是一个特殊的”GroupBy”对象。除了一些关于分组键df[“key1”]的一些中间数据外,它实际上还没有进行任何计算。这个对象拥有所有必需的信息,之后可以在每一个分组上应用一些操作。例如,为了计算分组的均值可以调用GroupBy的mean
方法。1>>> grouped = df["data1"].groupby(df["key1"])
2>>> grouped
3<pandas.core.groupby.generic.SeriesGroupBy object at 0x00000250966B98B0>
4
5>>> grouped.mean()
6key1
7a 2.666667
8b 4.333333
9Name: data1, dtype: float64
1>>> res = df["data1"].groupby([df["key1"], df["key2"]]).mean()
2>>> res
3key1 key2
4a 1 3.0
5 2 2.0
6b 1 4.5
7 2 4.0
8Name: data1, dtype: float64
9
10>>> res.unstack()
11key2 1 2
12key1
13a 3.0 2.0
14b 4.5 4.0
1>>> X1 = np.array(["AA", "AA", "BB", "BB", "BB", "AA"])
2>>> X2 = [2000, 2000, 2020, 2000, 2020, 2020]
3
4>>> df["data1"].groupby([X1,X2]).mean()
5AA 2000 1.5
6 2020 6.0
7BB 2000 4.0
8 2020 4.0
9Name: data1, dtype: float64
分组信息作为你想要继续处理的数据,通常包含在同一个DataFrame中。在这种情况下,可以传递列名(不管是字符串、数字还是其他Python对象)作为分组键。
key1
列。因为 df["key1"]
不是数值数据,所以它被认为是一个冗余列,因此会自动从结果中排除。 1>>> df.groupby("key1").mean()
2 key2 data1 data2
3key1
4a 1.333333 2.666667 8.666667
5b 1.333333 4.333333 10.333333
6
7# 因为 df["key1"] 不是数值数据,所以它被认为是一个冗余列,因此会自动从结果中排除
8>>> df.groupby("key2").mean()
9 data1 data2
10key2
111 3.75 9.75
122 3.00 9.00
13
14>>> df.groupby(["key1", "key2"]).mean()
15 data1 data2
16key1 key2
17a 1 3.0 9.0
18 2 2.0 8.0
19b 1 4.5 10.5
20 2 4.0 10.0
groupby
的目的是什么,通用的 GroupBy 方法是 size
,它返回包含组大小信息的 Series。本质上与 size 类似的组函数是 count,它计算每个组中非空值的数量。
1>>> df.groupby(["key1", "key2"]).size()
2key1 key2
3a 1 2
4 2 1
5b 1 2
6 2 1
7dtype: int64
8
9>>> df.groupby(["key1", "key2"]).count()
10 data1 data2
11key1 key2
12a 1 2 2
13 2 1 1
14b 1 2 2
15 2 1 1
dropna=False
传递给 groupby
来禁用此行为。 1>>> df2 = pd.DataFrame({"key1" : ["a", None, "b", "b", None, "b"],
2... "key2" : pd.Series([1, 2, None, 2, 1, 1], dtype="Int64"),
3... "data1" : [1, 2, 3, 4, 5, 6],
4... "data2" : [7, 8, 9, 10, 11, 12]})
5
6>>> df2
7 key1 key2 data1 data2
80 a 1 1 7
91 None 2 2 8
102 b <NA> 3 9
113 b 2 4 10
124 None 1 5 11
135 b 1 6 12
14
15>>> df2.groupby(["key1", "key2"]).mean()
16 data1 data2
17key1 key2
18a 1 1.0 7.0
19b 1 6.0 12.0
20 2 4.0 10.0
21
22>>> df2.groupby(["key1", "key2"]).size()
23key1 key2
24a 1 1
25b 1 1
26 2 1
27dtype: int64
2.遍历各分组:
groupby 返回的对象支持迭代,生成包含组名和数据块的二维元组序列。
1>>> for name, group in df.groupby("key1"):
2... print(name)
3... print(group)
4...
5a
6 key1 key2 data1 data2
70 a 1 1 7
81 a 2 2 8
94 a 1 5 11
10b
11 key1 key2 data1 data2
122 b 1 3 9
133 b 2 4 10
145 b 1 6 12
可以生成组名和数据块组成的字典,然后选中任一数据块进行你想要的操作。
1>>> pieces = {name: group for name, group in df.groupby("key1")}
2>>> pieces
3{'a': key1 key2 data1 data2
40 a 1 1 7
51 a 2 2 8
64 a 1 5 11, 'b': key1 key2 data1 data2
72 b 1 3 9
83 b 2 4 10
95 b 1 6 12}
10
11>>> pieces["b"]
12 key1 key2 data1 data2
132 b 1 3 9
143 b 2 4 10
155 b 1 6 12
在有多个分组键的情况下,元组中的第一个元素将是一个键值的元组。
1>>> for (k1, k2), group in df.groupby(["key1", "key2"]):
2... print((k1, k2))
3... print(group)
4...
5('a', 1)
6 key1 key2 data1 data2
70 a 1 1 7
84 a 1 5 11
9('a', 2)
10 key1 key2 data1 data2
111 a 2 2 8
12('b', 1)
13 key1 key2 data1 data2
142 b 1 3 9
155 b 1 6 12
16('b', 2)
17 key1 key2 data1 data2
183 b 2 4 10
默认情况下,groupby
在 axis=”index” 上分组,但你可以在其他轴上分组。
1>>> grouped = df.groupby({"key1": "key", "key2": "key","data1": "data", "data2": "data"}, axis="columns")
2
3>>> for group_key, group_values in grouped:
4... print(group_key)
5... print(group_values)
6...
7data
8 data1 data2
90 1 7
101 2 8
112 3 9
123 4 10
134 5 11
145 6 12
15key
16 key1 key2
170 a 1
181 a 2
192 b 1
203 b 2
214 a 1
225 b 1
23
24>>> grouped.count()
25 data key
260 2 2
271 2 2
282 2 2
293 2 2
304 2 2
315 2 2
本篇文章来源于微信公众号: 码农设计师