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

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


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

  • 可以在以下网站查看,该网站是使用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.选择一列或列的子集:
对DataFrame 创建的 GroupBy 对象用列名或列名数组进行索引时,具有用于聚合列子集的效果。
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([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
例如,在上面的小型DataFrame数据,要计算 data2 列的均值并获得DataFrame形式的结果,我们可以这样写。
如果传递的是列表或数组,则此索引操作返回的对象是分组的 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
2.用字典或Series分组:

分组信息可能以数组以外的形式存在。以下面的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, [12]] = 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
3.使用函数分组:

与字典或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, [12]] = 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
4.根据索引层级分组:

分层索引数据集有一个很方便的地方,就是能够使用轴索引的某个级别进行聚合。

以下面数据为例:

 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


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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments