使用 pandas GroupBy 或 pivot_table 查找最低每日价值
Find minimum daily value using pandas GroupBy or pivot_table
我有一个从 csv 文件(经过一些过滤后)获得的 Dataframe,如下所示:
df3.head(n = 10)
DateTime Det_ID Speed
16956 2014-01-01 07:00:00 1201085 65.0
16962 2014-01-01 07:00:00 1201110 69.5
19377 2014-01-01 08:00:00 1201085 65.0
19383 2014-01-01 08:00:00 1201110 65.0
21798 2014-01-01 09:00:00 1201085 65.0
21804 2014-01-01 09:00:00 1201110 65.4
75060 2014-01-02 07:00:00 1201085 64.9
75066 2014-01-02 07:00:00 1201110 66.1
77481 2014-01-02 08:00:00 1201085 65.0
77487 2014-01-02 08:00:00 1201110 62.5
这表示不同检测器(目前为两个)在一天中的不同时间测量的速度。我已将日期时间列转换为日期时间对象。
我需要知道每个检测器的速度的每日最小值。
基本上是这样的,然后我可以用它来构建热图。
df4 = df3.pivot_table(index='DateTime',columns='Det_ID',aggfunc=min)
df4.head()
Speed
Det_ID 1201085 1201110
DateTime
2014-01-01 07:00:00 65.0 69.5
2014-01-01 08:00:00 65.0 65.0
2014-01-01 09:00:00 65.0 65.4
2014-01-02 07:00:00 64.9 66.1
2014-01-02 08:00:00 65.0 62.5
显然,我使用枢轴 table 的方式是不正确的,因为我得到了每日速度的多个值,而不仅仅是一个。我怀疑这是因为最小值是在每个唯一的 DateTime 字段上计算的,而不仅仅是日期部分。
也在尝试 groupby 选项。
list(df3.groupby(['DateTime'], sort = False)['Speed'].min())
但它只给出了一个数字列表,没有任何其他列。
65.0,
65.0,
65.0,
64.900000000000006,
62.5,
64.200000000000003,
54.700000000000003,
62.600000000000001,
64.799999999999997,
59.5,
等等
如何只隔离 DateTime 字段中的日期部分?我什至在朝着正确的方向前进吗?谢谢。
调用 .dt.strftime
并重新格式化您的 DateTime
列。
df.DateTime = df.DateTime.dt.strftime('%m/%d/%Y')
df
DateTime Det_ID Speed
16956 01/01/2014 1201085 65.0
16962 01/01/2014 1201110 69.5
19377 01/01/2014 1201085 65.0
19383 01/01/2014 1201110 65.0
21798 01/01/2014 1201085 65.0
21804 01/01/2014 1201110 65.4
75060 01/02/2014 1201085 64.9
75066 01/02/2014 1201110 66.1
77481 01/02/2014 1201085 65.0
77487 01/02/2014 1201110 62.5
现在,致电pivot_table
:
df = df.pivot_table(index='DateTime', columns='Det_ID', values='Speed', aggfunc=np.min)
df
Det_ID 1201085 1201110
DateTime
01/01/2014 65.0 65.0
01/02/2014 64.9 62.5
或使用unstack
df.DateTime = df.DateTime.dt.strftime('%m/%d/%Y')
df.groupby(['DateTime','Det_ID']).Speed.min().unstack()
Out[300]:
Det_ID 1201085 1201110
DateTime
01/01/2014 65.0 65.0
01/02/2014 64.9 62.5
我有一个从 csv 文件(经过一些过滤后)获得的 Dataframe,如下所示:
df3.head(n = 10)
DateTime Det_ID Speed
16956 2014-01-01 07:00:00 1201085 65.0
16962 2014-01-01 07:00:00 1201110 69.5
19377 2014-01-01 08:00:00 1201085 65.0
19383 2014-01-01 08:00:00 1201110 65.0
21798 2014-01-01 09:00:00 1201085 65.0
21804 2014-01-01 09:00:00 1201110 65.4
75060 2014-01-02 07:00:00 1201085 64.9
75066 2014-01-02 07:00:00 1201110 66.1
77481 2014-01-02 08:00:00 1201085 65.0
77487 2014-01-02 08:00:00 1201110 62.5
这表示不同检测器(目前为两个)在一天中的不同时间测量的速度。我已将日期时间列转换为日期时间对象。
我需要知道每个检测器的速度的每日最小值。
基本上是这样的,然后我可以用它来构建热图。
df4 = df3.pivot_table(index='DateTime',columns='Det_ID',aggfunc=min)
df4.head()
Speed
Det_ID 1201085 1201110
DateTime
2014-01-01 07:00:00 65.0 69.5
2014-01-01 08:00:00 65.0 65.0
2014-01-01 09:00:00 65.0 65.4
2014-01-02 07:00:00 64.9 66.1
2014-01-02 08:00:00 65.0 62.5
显然,我使用枢轴 table 的方式是不正确的,因为我得到了每日速度的多个值,而不仅仅是一个。我怀疑这是因为最小值是在每个唯一的 DateTime 字段上计算的,而不仅仅是日期部分。
也在尝试 groupby 选项。
list(df3.groupby(['DateTime'], sort = False)['Speed'].min())
但它只给出了一个数字列表,没有任何其他列。
65.0,
65.0,
65.0,
64.900000000000006,
62.5,
64.200000000000003,
54.700000000000003,
62.600000000000001,
64.799999999999997,
59.5,
等等
如何只隔离 DateTime 字段中的日期部分?我什至在朝着正确的方向前进吗?谢谢。
调用 .dt.strftime
并重新格式化您的 DateTime
列。
df.DateTime = df.DateTime.dt.strftime('%m/%d/%Y')
df
DateTime Det_ID Speed
16956 01/01/2014 1201085 65.0
16962 01/01/2014 1201110 69.5
19377 01/01/2014 1201085 65.0
19383 01/01/2014 1201110 65.0
21798 01/01/2014 1201085 65.0
21804 01/01/2014 1201110 65.4
75060 01/02/2014 1201085 64.9
75066 01/02/2014 1201110 66.1
77481 01/02/2014 1201085 65.0
77487 01/02/2014 1201110 62.5
现在,致电pivot_table
:
df = df.pivot_table(index='DateTime', columns='Det_ID', values='Speed', aggfunc=np.min)
df
Det_ID 1201085 1201110
DateTime
01/01/2014 65.0 65.0
01/02/2014 64.9 62.5
或使用unstack
df.DateTime = df.DateTime.dt.strftime('%m/%d/%Y')
df.groupby(['DateTime','Det_ID']).Speed.min().unstack()
Out[300]:
Det_ID 1201085 1201110
DateTime
01/01/2014 65.0 65.0
01/02/2014 64.9 62.5