Pandas previous group min/max( pandas 上一组最小/最大值)
本文介绍了 pandas 上一组最小/最大值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在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/agg、shift和merge可以得到想要的结果:
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可以表示为与合并的结果
result在group日期。
这篇关于 pandas 上一组最小/最大值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:pandas 上一组最小/最大值
基础教程推荐
猜你喜欢
- matplotlib 设置 yaxis 标签大小 2022-01-01
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- Kivy 使用 opencv.调整图像大小 2022-01-01
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
