Pandas 十六:怎样实现groupby分组统计

类似SQL:
select city,max(temperature) from city_weather group by city;

groupby:先对数据分组,然后在每个分组上应用聚合函数、转换函数

本次演示:
一、分组使用聚合函数做数据统计
二、遍历groupby的结果理解执行流程
三、实例分组探索天气数据

1

import pandas as pd
import numpy as np
# 加上这一句,能在jupyter notebook展示matplot图表
%matplotlib inline

2

df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
                   'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                   'C': np.random.randn(8),
                   'D': np.random.randn(8)})
df

2

A	B	C	D
0	foo	one	0.542903	0.788896
1	bar	one	-0.375789	-0.345869
2	foo	two	-0.903407	0.428031
3	bar	three	-1.564748	0.081163
4	foo	two	-1.093602	0.837348
5	bar	two	-0.202403	0.701301
6	foo	one	-0.665189	-1.505290
7	foo	three	-0.498339	0.534438

一、分组使用聚合函数做数据统计

1、单个列groupby,查询所有数据列的统计

3

df.groupby('A').sum()

3

           C	D
A		
bar	-2.142940	0.436595
foo	-2.617633	1.083423

我们看到:

1.groupby中的’A’变成了数据的索引列
2.因为要统计sum,但B列不是数字,所以被自动忽略掉

2、多个列groupby,查询所有数据列的统计

4

df.groupby(['A','B']).mean()

4

                     C	D
A	B		
bar	one	-0.375789	-0.345869
three	-1.564748	0.081163
two	-0.202403	0.701301
foo	one	-0.061143	-0.358197
three	-0.498339	0.534438
two	-0.998504	0.632690

我们看到:(‘A’,‘B’)成对变成了二级索引
5

df.groupby(['A','B'], as_index=False).mean()

5

A	B	C	D
0	bar	one	-0.375789	-0.345869
1	bar	three	-1.564748	0.081163
2	bar	two	-0.202403	0.701301
3	foo	one	-0.061143	-0.358197
4	foo	three	-0.498339	0.534438
5	foo	two	-0.998504	0.632690

3、同时查看多种数据统计

6

df.groupby('A').agg([np.sum, np.mean, np.std])

6
在这里插入图片描述

我们看到:列变成了多级索引

4、查看单列的结果数据统计

7

# 方法1:预过滤,性能更好
df.groupby('A')['C'].agg([np.sum, np.mean, np.std])

7

				sum	mean	std
A			
bar	-2.142940	-0.714313	0.741583
foo	-2.617633	-0.523527	0.637822

8

# 方法2
df.groupby('A').agg([np.sum, np.mean, np.std])['C']

8

				sum	mean	std
A			
bar	-2.142940	-0.714313	0.741583
foo	-2.617633	-0.523527	0.637822

5、不同列使用不同的聚合函数

9

df.groupby('A').agg({"C":np.sum, "D":np.mean})

9

			C	D
A		
bar	-2.142940	0.145532
foo	-2.617633	0.216685

二、遍历groupby的结果理解执行流程

for循环可以直接遍历每个group

1、遍历单个列聚合的分组

10

g = df.groupby('A')
g

10
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000123B250E548>
11

for name,group in g:
    print(name)
    print(group)
    print()
bar
    		 A      B         C         D
1  bar    one -0.375789 -0.345869
3  bar  three -1.564748  0.081163
5  bar    two -0.202403  0.701301

foo
     		A      B         C         D
0  foo    one  0.542903  0.788896
2  foo    two -0.903407  0.428031
4  foo    two -1.093602  0.837348
6  foo    one -0.665189 -1.505290
7  foo  three -0.498339  0.534438

可以获取单个分组的数据
12

g.get_group('bar')

12

				A	B	C	D
1	bar	one	-0.375789	-0.345869
3	bar	three	-1.564748	0.081163
5	bar	two	-0.202403	0.701301

2、遍历多个列聚合的分组

13

g = df.groupby(['A', 'B'])

14

for name,group in g:
    print(name)
    print(group)
    print()

在这里插入图片描述

可以看到,name是一个2个元素的tuple,代表不同的列
15

g.get_group(('foo', 'one'))

15

		A	B	C	D
0	foo	one	0.542903	0.788896
6	foo	one	-0.665189	-1.505290

可以直接查询group后的某几列,生成Series或者子DataFrame
16

g['C']

16
<pandas.core.groupby.generic.SeriesGroupBy object at 0x00000123C33F64C8>
17

for name, group in g['C']:
    print(name)
    print(group)
    print(type(group))
    print()

在这里插入图片描述

其实所有的聚合统计,都是在dataframe和series上进行的;

三、实例分组探索天气数据

18

fpath = "./datas/beijing_tianqi/beijing_tianqi_2018.csv"
df = pd.read_csv(fpath)
# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
df.head()

18

ymd	bWendu	yWendu	tianqi	fengxiang	fengli	aqi	aqiInfo	aqiLevel
0	2018-01-01	3	-6~多云	东北风	1-2592
1	2018-01-02	2	-5~多云	东北风	1-2491
2	2018-01-03	2	-5	多云	北风	1-2281
3	2018-01-04	0	-8	阴	东北风	1-2281
4	2018-01-05	3	-6	多云~晴	西北风	1-2501

19

# 新增一列为月份
df['month'] = df['ymd'].str[:7]
df.head()

19

ymd	bWendu	yWendu	tianqi	fengxiang	fengli	aqi	aqiInfo	aqiLevel	month
0	2018-01-01	3	-6~多云	东北风	1-2592	2018-01
1	2018-01-02	2	-5~多云	东北风	1-2491	2018-01
2	2018-01-03	2	-5	多云	北风	1-2281	2018-01
3	2018-01-04	0	-8	阴	东北风	1-2281	2018-01
4	2018-01-05	3	-6	多云~晴	西北风	1-2501	2018-01

1、查看每个月的最高温度

20

data = df.groupby('month')['bWendu'].max()
data

20

month
2018-01     7
2018-02    12
2018-03    27
2018-04    30
2018-05    35
2018-06    38
2018-07    37
2018-08    36
2018-09    31
2018-10    25
2018-11    18
2018-12    10
Name: bWendu, dtype: int32

21

type(data)

21

pandas.core.series.Series

22

data.plot()

22
<matplotlib.axes._subplots.AxesSubplot at 0x123c344b308>

2、查看每个月的最高温度、最低温度、平均空气质量指数

23

df.head()

23

ymd	bWendu	yWendu	tianqi	fengxiang	fengli	aqi	aqiInfo	aqiLevel	month
0	2018-01-01	3	-6~多云	东北风	1-2592	2018-01
1	2018-01-02	2	-5~多云	东北风	1-2491	2018-01
2	2018-01-03	2	-5	多云	北风	1-2281	2018-01
3	2018-01-04	0	-8	阴	东北风	1-2281	2018-01
4	2018-01-05	3	-6	多云~晴	西北风	1-2501	2018-01

24

group_data = df.groupby('month').agg({"bWendu":np.max, "yWendu":np.min, "aqi":np.mean})
group_data

24

			bWendu	yWendu	aqi
month			
2018-01	7	-12	60.677419
2018-02	12	-10	78.857143
2018-03	27	-4	130.322581
2018-04	30	1	102.866667
2018-05	35	10	99.064516
2018-06	38	17	82.300000
2018-07	37	22	72.677419
2018-08	36	20	59.516129
2018-09	31	11	50.433333
2018-10	25	1	67.096774
2018-11	18	-4	105.100000
2018-12	10	-12	77.354839

25

group_data.plot()

25
<matplotlib.axes._subplots.AxesSubplot at 0x123c5502d48>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值