首页Python【Python数据分析】4...

【Python数据分析】46.数据聚合和分组操作——groupby方法1


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接: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([121211], dtype="Int64"),
3...                    "data1" : [123456],
4...                    "data2" : [789101112]})
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
如果,需要使用两个分组键对数据进行分组,需要将多个数组作为列表进行传递,结果Series是一个包含唯一键对的多层索引。
 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 = [200020002020200020202020]
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对象)作为分组键。

需要注意的是:在第二种情况 df.groupby(“key2”).mean()的结果中没有 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([12, None, 211], dtype="Int64"),
3...                    "data1" : [123456],
4...                    "data2" : [789101112]})
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” 上分组,但你可以在其他轴上分组。

例如,我们可以在这里根据示例 df 的列是以“key”还是“data”开头对它们进行分组。
 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


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments