python - Pandas 前一组最小/最大

标签 python pandas pandas-groupby

在 Pandas 中,我有这样的数据集:

                     Value
2005-08-03 23:15:00   10.5
2005-08-03 23:30:00   10.0
2005-08-03 23:45:00   10.0
2005-08-04 00:00:00   10.5
2005-08-04 00:15:00   10.5
2005-08-04 00:30:00   11.0
2005-08-04 00:45:00   10.5
2005-08-04 01:00:00   11.0
...
2005-08-04 23:15:00   14.0
2005-08-04 23:30:00   13.5
2005-08-04 23:45:00   13.0
2005-08-05 00:00:00   13.5
2005-08-05 00:15:00   14.0
2005-08-05 00:30:00   14.0
2005-08-05 00:45:00   14.5

首先,我想按日期对数据进行分组并将每个组的最大值存储在新列中,我使用以下代码来完成此任务:

df['ValueMaxInGroup'] = df.groupby(pd.TimeGrouper('D'))['Value'].transform(max)

现在我想创建另一列来存储前一组最大值,因此所需的数据框如下所示:

                     Value  ValueMaxInGroup  ValueMaxInPrevGroup
2005-08-03 23:15:00   10.5             10.5                  NaN
2005-08-03 23:30:00   10.0             10.5                  NaN
2005-08-03 23:45:00   10.0             10.5                  NaN
2005-08-04 00:00:00   10.5             14.0                 10.5
2005-08-04 00:15:00   10.5             14.0                 10.5
2005-08-04 00:30:00   11.0             14.0                 10.5
2005-08-04 00:45:00   10.5             14.0                 10.5
2005-08-04 01:00:00   11.0             14.0                 10.5
...
2005-08-04 23:15:00   14.0             14.0                 10.5
2005-08-04 23:30:00   13.5             14.0                 10.5
2005-08-04 23:45:00   13.0             14.0                 10.5
2005-08-05 00:00:00   13.5             14.5                 14.0
2005-08-05 00:15:00   14.0             14.5                 14.0
2005-08-05 00:30:00   14.0             14.5                 14.0
2005-08-05 00:45:00   14.5             14.5                 14.0

因此,为了简单地获取上一行的值,我使用了

df['ValueInPrevRow'] = df.shift(1)['Value']

有没有办法获得另一组的最小/最大/f(x)?我以为

df['ValueMaxInPrevGroup'] = df.groupby(pd.TimeGrouper('D')).shift(1)['Value'].transform(max)

但是没有成功。

最佳答案

您可以使用groupby/aggshiftmerge获得所需的结果:

import numpy as np
import pandas as pd
df = pd.DataFrame({'Value': [10.5, 10.0, 10.0, 10.5, 10.5, 11.0, 10.5, 11.0, 14.0, 13.5, 13.0, 13.5, 14.0, 14.0, 14.5]}, index=['2005-08-03 23:15:00', '2005-08-03 23:30:00', '2005-08-03 23:45:00', '2005-08-04 00:00:00', '2005-08-04 00:15:00', '2005-08-04 00:30:00', '2005-08-04 00:45:00', '2005-08-04 01:00:00', '2005-08-04 23:15:00', '2005-08-04 23:30:00', '2005-08-04 23:45:00', '2005-08-05 00:00:00', '2005-08-05 00:15:00', '2005-08-05 00:30:00', '2005-08-05 00:45:00']) 
df.index = pd.DatetimeIndex(df.index)

# This is equivalent to
# df['group'] = pd.to_datetime(df.index.date)
# when freq='D', but the version below works with any freq string, not just `'D'`.
grouped = df.groupby(pd.TimeGrouper('D'))
labels, uniqs, ngroups = grouped.grouper.group_info
df['group'] = grouped.grouper.binlabels[labels]

result = grouped[['Value']].agg(max)
result = result.rename(columns={'Value':'Max'})
result['PreviouMax'] = result['Max'].shift(1)

df = pd.merge(df, result, left_on=['group'], right_index=True)
print(df)

产量

                     Value      group   Max  PreviouMax
2005-08-03 23:15:00   10.5 2005-08-03  10.5         NaN
2005-08-03 23:30:00   10.0 2005-08-03  10.5         NaN
2005-08-03 23:45:00   10.0 2005-08-03  10.5         NaN
2005-08-04 00:00:00   10.5 2005-08-04  14.0        10.5
2005-08-04 00:15:00   10.5 2005-08-04  14.0        10.5
2005-08-04 00:30:00   11.0 2005-08-04  14.0        10.5
2005-08-04 00:45:00   10.5 2005-08-04  14.0        10.5
2005-08-04 01:00:00   11.0 2005-08-04  14.0        10.5
2005-08-04 23:15:00   14.0 2005-08-04  14.0        10.5
2005-08-04 23:30:00   13.5 2005-08-04  14.0        10.5
2005-08-04 23:45:00   13.0 2005-08-04  14.0        10.5
2005-08-05 00:00:00   13.5 2005-08-05  14.5        14.0
2005-08-05 00:15:00   14.0 2005-08-05  14.5        14.0
2005-08-05 00:30:00   14.0 2005-08-05  14.5        14.0
2005-08-05 00:45:00   14.5 2005-08-05  14.5        14.0
<小时/>

这里的主要思想是使用groupby/agg而不是groupby/transform,这样我们就可以获得

result = grouped[['Value']].agg(max)
result = result.rename(columns={'Value':'Max'})
result['PreviouMax'] = result['Max'].shift(1)
#              Max  PreviouMax
# group                       
# 2005-08-03  10.5         NaN
# 2005-08-04  14.0        10.5
# 2005-08-05  14.5        14.0

然后所需的DataFrame可以表示为将df日期的结果

关于python - Pandas 前一组最小/最大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38297700/

相关文章:

python - 尝试将 Python 与 Docker 集成。代码输入部分出错

python - 如何按python降序对整数列表进行排序

c# - 查询 Pandas 数据框

python - 如何在数据框中查找其间带有下划线文本的字符串

python - 在 pandas 组内分配分位数

Excel SUMIF 的 Pythonic 版本

python - 为什么Python2.7将caffe模型转换为Apple的mlmodel时会崩溃

python - 如何从 B 列的字符串中删除 A 列的字符串

python - 同时从两列中减去值( Pandas , python )

python - 删除每组中最后一个子组对应的行