本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用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>>> df.groupby("key1")["data1"]
2>>> df.groupby("key1")[["data2"]]
3
4# 是下面代码的语法糖
5>>> df["data1"].groupby(df["key1"])
6>>> df[["data2"]].groupby(df["key1"])
特别是对于大型数据集,我们可能希望只聚合几列。
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
data2
列的均值并获得DataFrame形式的结果,我们可以这样写。1>>> df.groupby(["key1", "key2"])[["data2"]].mean()
2 data2
3key1 key2
4a 1 9.0
5 2 8.0
6b 1 10.5
7 2 10.0
如果仅将单个列名作为标量传递,则返回的对象是分组的 Series。
1>>> s_grouped = df.groupby(["key1", "key2"])["data2"]
2
3>>> s_grouped
4<pandas.core.groupby.generic.SeriesGroupBy object at 0x000002509672A9A0>
5
6>>> s_grouped.mean()
7key1 key2
8a 1 9.0
9 2 8.0
10b 1 10.5
11 2 10.0
12Name: data2, dtype: float64
分组信息可能以数组以外的形式存在。以下面的DataFrame为例:
1>>> df = pd.DataFrame(np.arange(25).reshape(5,5),index=["Tom","Steve","Herry","Bill","Wanda"],columns=["data1","data2","data3","data4","data5"])
2
3>>> df.iloc[2:3, [1, 2]] = np.nan
4
5>>> df
6 data1 data2 data3 data4 data5
7Tom 0 1.0 2.0 3 4
8Steve 5 6.0 7.0 8 9
9Herry 10 NaN NaN 13 14
10Bill 15 16.0 17.0 18 19
11Wanda 20 21.0 22.0 23 24
假设有各列的分组对应关系mapping
,并且想按组对列求和。
可以根据这个字典构造一个数组以传递给 groupby
,但也可以只传递字典(其中,f
是未使用的分组键)。
1>>> mapping = {"data1": "a", "data2": "a", "data3": "b","data4": "b", "data5": "a", "data6" : "c"}
2
3>>> by_column = df.groupby(mapping, axis="columns")
4
5>>> by_column.sum()
6 a b
7Tom 5.0 5.0
8Steve 20.0 15.0
9Herry 24.0 13.0
10Bill 50.0 35.0
11Wanda 65.0 45.0
相同的功能也适用于Series,可以将其视为固定大小的映射。
1>>> map_series = pd.Series(mapping)
2>>> map_series
3data1 a
4data2 a
5data3 b
6data4 b
7data5 a
8data6 c
9dtype: object
10
11>>> df.groupby(map_series, axis="columns").sum()
12 a b
13Tom 5.0 5.0
14Steve 20.0 15.0
15Herry 24.0 13.0
16Bill 50.0 35.0
17Wanda 65.0 45.0
18
19>>> df.groupby(map_series, axis="columns").count()
20 a b
21Tom 3 2
22Steve 3 2
23Herry 2 1
24Bill 3 2
25Wanda 3 2
与字典或Series相比,使用 Python 函数是一种更通用的定义分组关系的方法。
作为分组键传递的任何函数都将针对每个索引值调用一次(如果使用 axis="columns"
,则针对每个列值调用一次),返回值用作组名。
以下面的 DataFrame为例,它以人们的名字作为索引值。假设你想按名字长度分组。虽然可以计算字符串长度数组,但传递 len
函数更简单。
1>>> df = pd.DataFrame(np.arange(25).reshape(5,5),index=["Tom","Steve","Herry","Bill","Wanda"],columns=["data1","data2","data3","data4","data5"])
2>>> df.iloc[2:3, [1, 2]] = np.nan
3
4>>> df
5 data1 data2 data3 data4 data5
6Tom 0 1.0 2.0 3 4
7Steve 5 6.0 7.0 8 9
8Herry 10 NaN NaN 13 14
9Bill 15 16.0 17.0 18 19
10Wanda 20 21.0 22.0 23 24
11
12
13>>> df.groupby(len).sum()
14 data1 data2 data3 data4 data5
153 0 1.0 2.0 3 4
164 15 16.0 17.0 18 19
175 35 27.0 29.0 44 47
可以将函数与数组、字典或Series等混合,因为所有内容都会在内部转换为数组。
1>>> key_list = ["one", "one", "one", "two", "two"]
2
3>>> df.groupby([len, key_list]).sum()
4 data1 data2 data3 data4 data5
53 one 0 1.0 2.0 3 4
64 two 15 16.0 17.0 18 19
75 one 15 6.0 7.0 21 23
8 two 20 21.0 22.0 23 24
分层索引数据集有一个很方便的地方,就是能够使用轴索引的某个级别进行聚合。
以下面数据为例:
1>>> columns = pd.MultiIndex.from_arrays([["L1","L1","L1","L2","L2"],["a","b","c","d","e"]],names=["level","data"])
2
3>>> df = pd.DataFrame(np.arange(25).reshape(5,5),columns=columns)
4
5>>> df
6level L1 L2
7data a b c d e
80 0 1 2 3 4
91 5 6 7 8 9
102 10 11 12 13 14
113 15 16 17 18 19
124 20 21 22 23 24
根据层级分组,将层级数值或层级名称传递给 level
关键字。
1>>> df.groupby(level="level", axis="columns").count()
2level L1 L2
30 3 2
41 3 2
52 3 2
63 3 2
74 3 2
本篇文章来源于微信公众号: 码农设计师