python - 取下一个组值并将其分配给当前组元素
问题描述
我的示例 df 是这样的:
hr temp1
hour
1900-01-01 00:00:00 0 19
1900-01-01 00:15:00 0 19
1900-01-01 00:30:00 0 19
1900-01-01 00:45:00 0 19
1900-01-01 01:00:00 1 18
1900-01-01 01:15:00 1 18
1900-01-01 01:30:00 1 18
1900-01-01 01:45:00 1 18
1900-01-01 02:00:00 2 18
1900-01-01 02:15:00 2 18
1900-01-01 02:30:00 2 18
1900-01-01 02:45:00 2 18
1900-01-01 03:00:00 3 17
预期输出(转换后):
hr temp1 temp
hour
1900-01-01 00:00:00 0 19 19 # as it is (current elem)
1900-01-01 00:15:00 0 19 18 # next group(hr=1) element
1900-01-01 00:30:00 0 19 18 # next group(hr=1) element
1900-01-01 00:45:00 0 19 18 # next group(hr=1) element
1900-01-01 01:00:00 1 18 18 # as it is (current elem)
1900-01-01 01:15:00 1 18 18 # next group(hr=2) element
1900-01-01 01:30:00 1 18 18 # next group(hr=2) element
1900-01-01 01:45:00 1 18 18 # next group(hr=2) element
1900-01-01 02:00:00 2 18 18 # as it is (current elem)
1900-01-01 02:15:00 2 18 17 # next group(hr=3) element
1900-01-01 02:30:00 2 18 17 # next group(hr=3) element
1900-01-01 02:45:00 2 18 17 # next group(hr=3) element
1900-01-01 03:00:00 3 17 17 # as it is (current elem)
所以基本上我想把下一个组值放到当前组中。保持行的第一个值相同。
由于我已经完成了 15 分钟的重采样,因此每个 hr 组都有重复的值。
我无法解决它。
编辑:
一种解决方案是在重新采样之前进行移位和赋值。因为当我填充时,我将拥有下一个组元素值。我可以将每个组的第一个值更改为 row['temp'] 这样的东西。
这是重采样前的数据:
temp1 hr
hour
1900-01-01 00:00:00 19 0
1900-01-01 01:00:00 18 1
1900-01-01 02:00:00 18 2
1900-01-01 03:00:00 17 3
编辑2:
重采样前:
df[['temp1']].shift(-1).fillna(df.iloc[df.shape[0]-1]['temp1']).resample('900s').pad()
然后进行第 1 组第 1 个元素分配。
但这看起来太复杂了。
解决方案
编辑
如果您的数据是这样开始的,如您在编辑中所示:
temp
1900-01-01 00:00:00 19
1900-01-01 01:00:00 18
1900-01-01 02:00:00 18
1900-01-01 03:00:00 17
您可以重新采样和回填:
>>> df.resample('15T').bfill()
temp
1900-01-01 00:00:00 19
1900-01-01 00:15:00 18
1900-01-01 00:30:00 18
1900-01-01 00:45:00 18
1900-01-01 01:00:00 18
1900-01-01 01:15:00 18
1900-01-01 01:30:00 18
1900-01-01 01:45:00 18
1900-01-01 02:00:00 18
1900-01-01 02:15:00 17
1900-01-01 02:30:00 17
1900-01-01 02:45:00 17
1900-01-01 03:00:00 17
否则,这是我的原始答案。
用于diff
获取何时hr
更改。使用更改的值启动新temp
列,然后回填:temp1
hr
starts = df['hr'].diff() != 0
df['temp'] = df['temp1'][starts]
df['temp'] = df['temp'].bfill()
我使用的数据:
import pandas as pd
dr = pd.date_range('01-01-1900 00:00:00', '01-01-1900 03:00:00', freq='15T')
hr = [0,0,0,0,1,1,1,1,2,2,2,2,3]
temp = [19,19,19,19,18,18,18,18,18,18,18,18,17]
df = pd.DataFrame({'hr':hr, 'temp1':temp}, index=dr)
结果:
>>> df
hr temp1 temp
1900-01-01 00:00:00 0 19 19.0
1900-01-01 00:15:00 0 19 18.0
1900-01-01 00:30:00 0 19 18.0
1900-01-01 00:45:00 0 19 18.0
1900-01-01 01:00:00 1 18 18.0
1900-01-01 01:15:00 1 18 18.0
1900-01-01 01:30:00 1 18 18.0
1900-01-01 01:45:00 1 18 18.0
1900-01-01 02:00:00 2 18 18.0
1900-01-01 02:15:00 2 18 17.0
1900-01-01 02:30:00 2 18 17.0
1900-01-01 02:45:00 2 18 17.0
1900-01-01 03:00:00 3 17 17.0
推荐阅读
- php - JSONRPC sendtoaddress 返回“结果”:null,“错误”,手动运行 cURL
- python - 使用 Python ftplib 处理大型机 PDS 时“站点 sbd”的含义
- api - MessageBird WhatsApp:无法从沙盒模式移动
- c# - RoutedEvents 组合框未触发
- javascript - MediaWiki API:按内容模型获取页面
- drools - 在 Drools 中设置和获取全局变量
- list - Map 的 Flutter 属性值都被视为字符串
- css - 设置列表组件之间的固定边距
- sql - 雪花任务正在执行,但在查询历史记录中找不到它们
- arrays - 按结构的非成员对结构数组进行排序