首页 > 解决方案 > 取下一个组值并将其分配给当前组元素

问题描述

我的示例 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 个元素分配。

但这看起来太复杂了。

标签: pythonpandas

解决方案


编辑

如果您的数据是这样开始的,如您在编辑中所示:

                     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列,然后回填:temp1hr

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

推荐阅读