介绍:
本文重点介绍了pandas中resample、groupby、Grouper和agg函数的使用。
resample
Pandas中的resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换的便捷的方法。
降采样:高频数据到低频数据
升采样:低频数据到高频数据
主要函数:resample()(pandas对象都会有这个方法)
resample方法的参数
参数 | 说明 |
---|---|
freq | 表示重采样频率,例如‘M’、‘5min’,Second(15) |
how=’mean’ | 用于产生聚合值的函数名或数组函数,例如‘mean’、‘ohlc’、np.max等,默认是‘mean’,其他常用的值由:‘first’、‘last’、‘median’、‘max’、‘min’ |
axis=0 | 默认是纵轴,横轴设置axis=1 |
fill_method = None | 升采样时如何插值,比如‘ffill’、‘bfill’等 |
closed = ‘right’ | 在降采样时,各时间段的哪一段是闭合的,‘right’或‘left’,默认‘right’ |
label= ‘right’ | 在降采样时,如何设置聚合值的标签,例如,9:30-9:35会被标记成9:30还是9:35,默认9:30 |
loffset = None | 面元标签的时间校正值,比如‘-1s’或Second(-1)用于将聚合标签调早1秒 |
limit=None | 在向前或向后填充时,允许填充的最大时期数 |
kind = None | 聚合到时期(‘period’)或时间戳(‘timestamp’),默认聚合到时间序列的索引类型 |
convention = None | 当重采样时期时,将低频率转换到高频率所采用的约定(start或end)。默认‘end’ |
首先创建一个series,采样频率为一分钟。
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
index = pd.date_range('1/1/2000', periods=9, freq='T')
series = pd.Series(range(9), index=index)
series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64
降低采样频率为三分钟:
series.resample('3T').sum()
2000-01-01 00:00:00 3
2000-01-01 00:03:00 12
2000-01-01 00:06:00 21
Freq: 3T, dtype: int64
降低采样频率为三分钟,但是每个标签使用right来代替left。
注意:bucket中的值用作标签:
series.resample('3T', label='right').sum()
2000-01-01 00:03:00 3
2000-01-01 00:06:00 12
2000-01-01 00:09:00 21
Freq: 3T, dtype: int64
降低采样频率为三分钟,但是关闭right区间,即左开右闭区间
series.resample('3T', label='right', closed='right').sum()
2000-01-01 00:00:00 0
2000-01-01 00:03:00 6
2000-01-01 00:06:00 15
2000-01-01 00:09:00 15
Freq: 3T, dtype: int64
增加采样频率到30秒
series.resample('30S').asfreq()[0:5] # asfreq是日期序列补充函数
2000-01-01 00:00:00 0.0
2000-01-01 00:00:30 NaN
2000-01-01 00:01:00 1.0
2000-01-01 00:01:30 NaN
2000-01-01 00:02:00 2.0
Freq: 30S, dtype: float64
增加采样频率到30S,使用pad方法填充nan值。
series.resample('30S').pad()[0:5]
2000-01-01 00:00:00 0
2000-01-01 00:00:30 0
2000-01-01 00:01:00 1
2000-01-01 00:01:30 1
2000-01-01 00:02:00 2
Freq: 30S, dtype: int64
增加采样频率到30S,使用bfill方法填充nan值。
series.resample('30S').bfill()[0:5]
2000-01-01 00:00:00 0
2000-01-01 00:00:30 1
2000-01-01 00:01:00 1
2000-01-01 00:01:30 2
2000-01-01 00:02:00 2
Freq: 30S, dtype: int64
通过apply运行一个自定义函数
def custom_resampler(array_like):
return np.sum(array_like) + 5
series.resample('3T').apply(custom_resampler)
2000-01-01 00:00:00 8
2000-01-01 00:03:00 17
2000-01-01 00:06:00 26
Freq: 3T, dtype: int64
groupby && Grouper
什么是group by
groupby就是按xx分组, 它也确实是用来实现这样功能的.
data = pd.read_excel('original_data.xls')
data.sample(10)
热水器编号 | 发生时间 | 开关机状态 | 加热中 | 保温中 | 有无水流 | 实际温度 | 热水量 | 水流量 | 节能模式 | 加热剩余时间 | 当前设置温度 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2833 | R_00001 | 20141021214604 | 开 | 开 | 关 | 有 | 39°C | 25% | 30 | 关 | 11分钟 | 50°C |
13993 | R_00001 | 20141105072458 | 关 | 关 | 关 | 无 | 30°C | 0% | 0 | 关 | 0分钟 | 50°C |
5933 | R_00001 | 20141025033700 | 关 | 关 | 关 | 无 | 29°C | 0% | 0 | 关 | 0分钟 | 50°C |
14002 | R_00001 | 20141105072647 | 关 | 关 | 关 | 无 | 31°C | 0% | 0 | 关 | 0分钟 | 50°C |
7228 | R_00001 | 20141026044313 | 关 | 关 | 关 | 无 | 30°C | 0% | 0 | 关 | 0分钟 | 50°C |
2825 | R_00001 | 20141021214455 | 开 | 开 | 关 | 有 | 39°C | 25% | 30 | 关 | 12分钟 | 50°C |
17044 | R_00001 | 20141108224924 | 开 | 开 | 关 | 无 | 43°C | 50% | 0 | 关 | 9分钟 | 50°C |
10696 | R_00001 | 20141031194704 | 关 | 关 | 关 | 有 | 47°C | 50% | 25 | 关 | 0分钟 | 50°C |
15135 | R_00001 | 20141106084205 | 开 | 关 | 开 | 无 | 47°C | 50% | 0 | 关 | 0分钟 | 50°C |
18449 | R_00001 | 20141110185948 | 开 | 开 | 关 | 有 | 47°C | 50% | 35 | 关 | 3分钟 | 50°C |
data.groupby('实际温度')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000000000E003588>
这里我们得到了一个叫DataFrameGroupBy的东西, 虽然 pandas 不让我们直接看它长啥样, 但是你将它想象成上面那幅分组后的图(我手绘的)是完全没有问题的.
这里主要介绍如何鼓捣这个DataFrameGroupBy, 这个DataFrameGroupBy主要的功能能是允许你在不额外写循环的情况下, 快速对每一组数据进行操作
1.分组情况
for index, da in data.groupby('实际温度'):
print(index)
print(da)
28°C
热水器编号 发生时间 开关机状态 加热中 保温中 有无水流 实际温度 热水量 水流量 节能模式 加热剩余时间 \
511 R_00001 20141019154300 开 开 关 有 28°C 0% 42 关 31分钟
512 R_00001 20141019154302 开 开 关 有 28°C 0% 42 关 29分钟
4334 R_00001 20141024122809 关 关 关 无 28°C 0% 0 关 0分钟
4336 R_00001 20141024122952 关 关 关 无 28°C 0% 0 关 0分钟
4338 R_00001 20141024123224 关 关 关 无 28°C 0% 0 关 0分钟
... ... ... ... .. .. ... ... .. ... ... ...
6215 R_00001 20141025124503 关 关 关 无 28°C 0% 0 关 0分钟
6216 R_00001 20141025130406 关 关 关 无 28°C 0% 0 关 0分钟
6217 R_00001 20141025130408 关 关 关 无 28°C 0% 10 关 0分钟
6218 R_00001 20141025153300 关 关 关 无 28°C 0% 0 关 0分钟
6219 R_00001 20141025153306 开 开 关 无 28°C 0% 0 关 31分钟
当前设置温度
511 50°C
512 50°C
4334 50°C
4336 50°C
4338 50°C
... ...
6215 50°C
6216 50°C
6217 50°C
6218 50°C
6219 50°C
[824 rows x 12 columns]
29°C
热水器编号 发生时间 开关机状态 加热中 保温中 有无水流 实际温度 热水量 水流量 节能模式 加热剩余时间 \
4 R_00001 20141019071236 关 关 关 无 29°C 0% 0 关 0分钟
6 R_00001 20141019071608 关 关 关 无 29°C 0% 0 关 0分钟
8 R_00001 20141019072010 关 关 关 无 29°C 0% 0 关 0分钟
10 R_00001 20141019072159 关 关 关 无 29°C 0% 0 关 0分钟
12 R_00001 20141019072219 关 关 关 无 29°C 0% 0 关 0分钟
... ... ... ... .. .. ... ... .. ... ... ...
12246 R_00001 20141102173805 开 开 关 无 29°C 0% 0 关 27分钟
12247 R_00001 20141102173825 开 开 关 无 29°C 0% 0 关 26分钟
12248 R_00001 20141102173827 开 开 关 无 29°C 0% 0 关 28分钟
14239 R_00001 20141105151543 开 开 关 无 29°C 0% 0 关 29分钟
14240 R_00001 20141105151547 开 开 关 无 29°C 0% 0 关 28分钟
当前设置温度
4 50°C
6 50°C
8 50°C
10 50°C
12 50°C
... ...
12246 50°C
12247 50°C
12248 50°C
14239 50°C
14240 50°C
[1729 rows x 12 columns]
30°C
热水器编号 发生时间 开关机状态 加热中 保温中 有无水流 实际温度 热水量 水流量 节能模式 加热剩余时间 \
0 R_00001 20141019063917 关 关 关 无 30°C 0% 0 关 0分钟
1 R_00001 20141019070154 关 关 关 无 30°C 0% 0 关 0分钟
2 R_00001 20141019070156 关 关 关 无 30°C 0% 8 关 0分钟
3 R_00001 20141019071230 关 关 关 无 30°C 0% 0 关 0分钟
5 R_00001 20141019071602 关 关 关 无 30°C 0% 0 关 0分钟
... ... ... ... .. .. ... ... ... ... ... ...
16754 R_00001 20141108214826 开 开 关 无 30°C 0% 0 关 28分钟
18143 R_00001 20141110160157 开 开 关 无 30°C 25% 0 关 28分钟
18144 R_00001 20141110160159 开 开 关 无 30°C 25% 0 关 27分钟
18146 R_00001 20141110160228 开 开 关 无 30°C 25% 0 关 28分钟
18147 R_00001 20141110160230 开 开 关 无 30°C 25% 0 关 27分钟
当前设置温度
0 50°C
1 50°C
2 50°C
3 50°C
5 50°C
... ...
16754 50°C
18143 50°C
18144 50°C
18146 50°C
18147 50°C
[918 rows x 12 columns]
31°C
热水器编号 发生时间 开关机状态 加热中 保温中 有无水流 实际温度 热水量 水流量 节能模式 加热剩余时间 \
599 R_00001 20141019155213 开 开 关 无 31°C 0% 0 关 26分钟
600 R_00001 20141019155219 开 开 关 无 31°C 0% 0 关 25分钟
1418 R_00001 20141020073544 关 关 关 有 31°C 0% 62 关 0分钟
1419 R_00001 20141020073546 关 关 关 有 31°C 0% 65 关 0分钟
1420 R_00001 20141020073548 关 关 关 有 31°C 0% 62 关 0分钟
... ... ... ... .. .. ... ... ... ... ... ...
18145 R_00001 20141110160205 开 开 关 无 31°C 25% 0 关 26分钟
18148 R_00001 20141110160326 开 开 关 无 31°C 25% 0 关 26分钟
18149 R_00001 20141110160407 开 开 关 无 31°C 25% 0 关 25分钟
18326 R_00001 20141110163715 开 开 关 无 31°C 25% 0 关 26分钟
18327 R_00001 20141110163808 开 开 关 无 31°C 25% 0 关 25分钟
当前设置温度
599 50°C
600 50°C
1418 50°C
1419 50°C
1420 50°C
... ...
18145 50°C
18148 50°C
18149 50°C
18326 50°C
18327 50°C
[800 rows x 12 columns]
2.进行mean、sum等操作
data.groupby('实际温度')['水流量'].mean()
实际温度
28°C 0.682039
29°C 7.914401
30°C 3.990196
31°C 10.140000
32°C 7.120347
33°C 10.966903
34°C 13.509168
35°C 12.672078
36°C 10.804082
37°C 14.778990
38°C 15.113074
39°C 18.557143
40°C 18.666667
41°C 20.398533
42°C 21.271560
43°C 14.246231
44°C 12.282230
45°C 11.093502
46°C 19.127957
47°C 15.839080
48°C 11.774783
49°C 12.658098
50°C 21.065473
51°C 5.186047
Name: 水流量, dtype: float64
data.groupby('实际温度')['加热剩余时间'].value_counts()
实际温度 加热剩余时间
28°C 0分钟 819
31分钟 3
29分钟 2
29°C 0分钟 1540
25分钟 92
...
49°C 1分钟 140
2分钟 6
50°C 0分钟 1617
1分钟 2
51°C 0分钟 86
Name: 加热剩余时间, Length: 132, dtype: int64
注: 这时, 组内操作的结果不是单个值, 是一个序列, 我们可以用.unstack()将它展开:
data.groupby('实际温度')['加热剩余时间'].value_counts().unstack()
加热剩余时间 | 0分钟 | 10分钟 | 11分钟 | 12分钟 | 13分钟 | 14分钟 | 15分钟 | 16分钟 | 17分钟 | 18分钟 | ... | 29分钟 | 2分钟 | 31分钟 | 3分钟 | 4分钟 | 5分钟 | 6分钟 | 7分钟 | 8分钟 | 9分钟 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
实际温度 | |||||||||||||||||||||
28°C | 819.0 | NaN | NaN | NaN | NaN | ||||||||||||||||
29°C | 1540.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | 35.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
30°C | 857.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | 2.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
31°C | 625.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
32°C | 653.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
33°C | 625.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
34°C | 522.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
35°C | 405.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | 1.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
36°C | 317.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 | 42.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
37°C | 344.0 | NaN | NaN | NaN | NaN | 59.0 | 33.0 | 46.0 | 113.0 | 119.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
38°C | 270.0 | NaN | NaN | NaN | NaN | 8.0 | 55.0 | 186.0 | 30.0 | 17.0 | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
39°C | 216.0 | NaN | 18.0 | 11.0 | 20.0 | 118.0 | 156.0 | 7.0 | 14.0 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
40°C | 149.0 | 39.0 | 15.0 | 52.0 | 98.0 | 63.0 | 13.0 | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
41°C | 212.0 | 1.0 | 81.0 | 105.0 | NaN | 9.0 | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 1.0 |
42°C | 160.0 | 123.0 | 101.0 | 11.0 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 40.0 | 110.0 |
43°C | 227.0 | NaN | 11.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | 1.0 | 5.0 | 4.0 | 40.0 | 110.0 |
44°C | 360.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | 12.0 | 76.0 | 114.0 | 12.0 |
45°C | 342.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | 1.0 | 4.0 | 37.0 | 156.0 | 84.0 | 7.0 | NaN |
46°C | 502.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | 5.0 | NaN | 29.0 | 135.0 | 237.0 | NaN | 14.0 | NaN | NaN |
47°C | 903.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | 83.0 | NaN | 150.0 | 121.0 | 12.0 | NaN | NaN | NaN | NaN |
48°C | 961.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | 135.0 | NaN | NaN | 6.0 | NaN | NaN | NaN | NaN | NaN |
49°C | 1021.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | 6.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
50°C | 1617.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
51°C | 86.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN |
24 rows × 31 columns
3.聚合
对分组后的数据进行聚合:
data.groupby('实际温度').agg(['min', 'max'])
热水器编号 | 发生时间 | 开关机状态 | 加热中 | 保温中 | ... | 热水量 | 水流量 | 节能模式 | 加热剩余时间 | 当前设置温度 | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
min | max | min | max | min | max | min | max | min | max | ... | min | max | min | max | min | max | min | max | min | max | |
实际温度 | |||||||||||||||||||||
28°C | R_00001 | R_00001 | 20141019154300 | 20141025153306 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 0% | 0 | 42 | 关 | 关 | 0分钟 | 31分钟 | 50°C | 50°C |
29°C | R_00001 | R_00001 | 20141019071236 | 20141105151547 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 0% | 0 | 67 | 关 | 关 | 0分钟 | 31分钟 | 50°C | 50°C |
30°C | R_00001 | R_00001 | 20141019063917 | 20141110160230 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 56 | 关 | 关 | 0分钟 | 29分钟 | 50°C | 50°C |
31°C | R_00001 | R_00001 | 20141019155213 | 20141110163808 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 66 | 关 | 关 | 0分钟 | 28分钟 | 50°C | 50°C |
32°C | R_00001 | R_00001 | 20141019155250 | 20141110163908 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 63 | 关 | 关 | 0分钟 | 26分钟 | 50°C | 50°C |
33°C | R_00001 | R_00001 | 20141019155318 | 20141110163951 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 63 | 关 | 关 | 0分钟 | 25分钟 | 50°C | 50°C |
34°C | R_00001 | R_00001 | 20141019155400 | 20141110164051 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 63 | 关 | 关 | 0分钟 | 24分钟 | 50°C | 50°C |
35°C | R_00001 | R_00001 | 20141019155519 | 20141110164146 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 66 | 关 | 关 | 0分钟 | 22分钟 | 50°C | 50°C |
36°C | R_00001 | R_00001 | 20141019155749 | 20141110220338 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 62 | 关 | 关 | 0分钟 | 21分钟 | 50°C | 50°C |
37°C | R_00001 | R_00001 | 20141019155817 | 20141110220527 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 51 | 关 | 关 | 0分钟 | 19分钟 | 50°C | 50°C |
38°C | R_00001 | R_00001 | 20141019155934 | 20141110220609 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 51 | 关 | 关 | 0分钟 | 18分钟 | 50°C | 50°C |
39°C | R_00001 | R_00001 | 20141019155940 | 20141110220710 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 50 | 关 | 关 | 0分钟 | 17分钟 | 50°C | 50°C |
40°C | R_00001 | R_00001 | 20141019160111 | 20141110220804 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 52 | 关 | 关 | 0分钟 | 15分钟 | 50°C | 50°C |
41°C | R_00001 | R_00001 | 20141019160239 | 20141110220859 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 25% | 0 | 53 | 关 | 关 | 0分钟 | 9分钟 | 50°C | 50°C |
42°C | R_00001 | R_00001 | 20141019160322 | 20141110220959 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 50% | 0 | 62 | 关 | 关 | 0分钟 | 9分钟 | 50°C | 50°C |
43°C | R_00001 | R_00001 | 20141019160525 | 20141110221042 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 50% | 0 | 72 | 关 | 关 | 0分钟 | 9分钟 | 50°C | 50°C |
44°C | R_00001 | R_00001 | 20141019160557 | 20141110221142 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 0% | 50% | 0 | 68 | 关 | 关 | 0分钟 | 9分钟 | 50°C | 50°C |
45°C | R_00001 | R_00001 | 20141019160638 | 20141110221219 | 关 | 开 | 关 | 开 | 关 | 关 | ... | 25% | 50% | 0 | 68 | 关 | 关 | 0分钟 | 8分钟 | 50°C | 50°C |
46°C | R_00001 | R_00001 | 20141019160803 | 20141110221335 | 关 | 开 | 关 | 开 | 关 | 开 | ... | 100% | 50% | 0 | 68 | 关 | 关 | 0分钟 | 7分钟 | 50°C | 50°C |
47°C | R_00001 | R_00001 | 20141019160855 | 20141110221444 | 关 | 开 | 关 | 开 | 关 | 开 | ... | 100% | 50% | 0 | 63 | 关 | 关 | 0分钟 | 5分钟 | 50°C | 50°C |
48°C | R_00001 | R_00001 | 20141019161040 | 20141110221551 | 关 | 开 | 关 | 开 | 关 | 开 | ... | 100% | 50% | 0 | 63 | 关 | 关 | 0分钟 | 4分钟 | 50°C | 50°C |
49°C | R_00001 | R_00001 | 20141019161106 | 20141110231954 | 关 | 开 | 关 | 开 | 关 | 开 | ... | 25% | 50% | 0 | 63 | 关 | 关 | 0分钟 | 2分钟 | 50°C | 50°C |
50°C | R_00001 | R_00001 | 20141019161149 | 20141110232000 | 关 | 开 | 关 | 开 | 关 | 开 | ... | 100% | 50% | 0 | 77 | 关 | 关 | 0分钟 | 1分钟 | 50°C | 50°C |
51°C | R_00001 | R_00001 | 20141019181335 | 20141110195611 | 开 | 开 | 关 | 开 | 关 | 开 | ... | 50% | 50% | 0 | 50 | 关 | 关 | 0分钟 | 0分钟 | 50°C | 50°C |
24 rows × 22 columns
对分组后的部分列进行聚合
某些情况,只需要对部分数据进行不同的聚合操作,可以通过字典来构建
num_agg = {'水流量':['min', 'mean', 'max']}
data.groupby('实际温度').agg(num_agg)
水流量 | |||
---|---|---|---|
min | mean | max | |
实际温度 | |||
28°C | 0 | 0.682039 | 42 |
29°C | 0 | 7.914401 | 67 |
30°C | 0 | 3.990196 | 56 |
31°C | 0 | 10.140000 | 66 |
32°C | 0 | 7.120347 | 63 |
33°C | 0 | 10.966903 | 63 |
34°C | 0 | 13.509168 | 63 |
35°C | 0 | 12.672078 | 66 |
36°C | 0 | 10.804082 | 62 |
37°C | 0 | 14.778990 | 51 |
38°C | 0 | 15.113074 | 51 |
39°C | 0 | 18.557143 | 50 |
40°C | 0 | 18.666667 | 52 |
41°C | 0 | 20.398533 | 53 |
42°C | 0 | 21.271560 | 62 |
43°C | 0 | 14.246231 | 72 |
44°C | 0 | 12.282230 | 68 |
45°C | 0 | 11.093502 | 68 |
46°C | 0 | 19.127957 | 68 |
47°C | 0 | 15.839080 | 63 |
48°C | 0 | 11.774783 | 63 |
49°C | 0 | 12.658098 | 63 |
50°C | 0 | 21.065473 | 77 |
51°C | 0 | 5.186047 | 50 |
num_agg = {'水流量':['min', 'mean', 'max'], '加热剩余时间':['min', 'max']}
data.groupby('实际温度').agg(num_agg)
水流量 | 加热剩余时间 | ||||
---|---|---|---|---|---|
min | mean | max | min | max | |
实际温度 | |||||
28°C | 0 | 0.682039 | 42 | 0分钟 | 31分钟 |
29°C | 0 | 7.914401 | 67 | 0分钟 | 31分钟 |
30°C | 0 | 3.990196 | 56 | 0分钟 | 29分钟 |
31°C | 0 | 10.140000 | 66 | 0分钟 | 28分钟 |
32°C | 0 | 7.120347 | 63 | 0分钟 | 26分钟 |
33°C | 0 | 10.966903 | 63 | 0分钟 | 25分钟 |
34°C | 0 | 13.509168 | 63 | 0分钟 | 24分钟 |
35°C | 0 | 12.672078 | 66 | 0分钟 | 22分钟 |
36°C | 0 | 10.804082 | 62 | 0分钟 | 21分钟 |
37°C | 0 | 14.778990 | 51 | 0分钟 | 19分钟 |
38°C | 0 | 15.113074 | 51 | 0分钟 | 18分钟 |
39°C | 0 | 18.557143 | 50 | 0分钟 | 17分钟 |
40°C | 0 | 18.666667 | 52 | 0分钟 | 15分钟 |
41°C | 0 | 20.398533 | 53 | 0分钟 | 9分钟 |
42°C | 0 | 21.271560 | 62 | 0分钟 | 9分钟 |
43°C | 0 | 14.246231 | 72 | 0分钟 | 9分钟 |
44°C | 0 | 12.282230 | 68 | 0分钟 | 9分钟 |
45°C | 0 | 11.093502 | 68 | 0分钟 | 8分钟 |
46°C | 0 | 19.127957 | 68 | 0分钟 | 7分钟 |
47°C | 0 | 15.839080 | 63 | 0分钟 | 5分钟 |
48°C | 0 | 11.774783 | 63 | 0分钟 | 4分钟 |
49°C | 0 | 12.658098 | 63 | 0分钟 | 2分钟 |
50°C | 0 | 21.065473 | 77 | 0分钟 | 1分钟 |
51°C | 0 | 5.186047 | 50 | 0分钟 | 0分钟 |
4.grouper
data.groupby(['实际温度', pd.Grouper(key='开关机状态')])['水流量'].sum()
实际温度 开关机状态
28°C 关 478
开 84
29°C 关 5889
开 7795
30°C 关 2544
开 1119
31°C 关 3110
开 5002
32°C 关 2100
开 3639
33°C 关 3823
开 5455
34°C 关 6261
开 3317
35°C 关 4980
开 2826
36°C 关 2987
开 2307
37°C 关 3119
开 7714
38°C 关 2104
开 6450
39°C 关 2492
开 7900
40°C 关 2104
开 5904
41°C 关 4920
开 3423
42°C 关 3290
开 8303
43°C 关 3304
开 2366
44°C 关 4048
开 3002
45°C 关 2607
开 4393
46°C 关 7228
开 10561
47°C 关 9643
开 11027
48°C 关 9596
开 3945
49°C 关 9936
开 4836
50°C 关 19012
开 15093
51°C 开 446
Name: 水流量, dtype: int64
方法总结
- 首先通过groupby得到DataFrameGroupBy对象, 比如data.groupby(‘实际温度’)
- 然后选择需要研究的列, 比如[‘加热剩余时间’], 这样我们就得到了一个SeriesGroupby, 它代表每一个组都有一个Series
- 对SeriesGroupby进行操作, 比如.mean(), 相当于对每个组的Series求均值
注: 如果不选列, 那么第三步的操作会遍历所有列, pandas会对能成功操作的列进行操作, 最后返回的一个由操作成功的列组成的DataFrame