Python 获取下一个组值并将其分配给当前组元素

Python 获取下一个组值并将其分配给当前组元素,python,pandas,Python,Pandas,我的示例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-0

我的示例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
预期输出(转换后):

所以基本上我想把下一个组值放到当前组中。 保持行的第一个值相同

因为我在15分钟前进行了重采样,所以每个hr组都有重复的值

我没办法解决它

编辑: 一种解决方案是在重新采样之前进行移位和赋值。因为当我将填充时,我将有下一个组元素值。我可以将每组第一个值更改为行['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 
df[['temp1']].shift(-1).fillna(df.iloc[df.shape[0]-1]['temp1']).resample('900s').pad()
编辑2: 重新采样前:

                    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 
df[['temp1']].shift(-1).fillna(df.iloc[df.shape[0]-1]['temp1']).resample('900s').pad()
然后进行第一组第一个元素赋值

但这看起来太复杂了。

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

                     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
starts = df['hr'].diff() != 0
df['temp'] = df['temp1'][starts]
df['temp'] = df['temp'].bfill()

否则,这就是我最初的答案

使用
diff
获取
hr
更改的时间。使用
hr
更改的
temp1
值启动新的
temp
列,然后回填:

>>> 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
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
使用所有行并将其替换为
np.nan
,每组中第一行除外。然后简单地说:


这看起来不错。谢谢我感谢你的帮助:)。@Pygirl很乐意帮忙。啊。我没看到你的编辑部分。该死,我错过了一些要点。否则我想我的答案是好的。是的,两个都很好。很难选择。但当他编辑他的答案时,它解决了我的困境:“)。谢谢你们,没问题。快乐编码。问得好。你已经投票了!:O该死,在重采样方面做起来很容易,而且我没有看
b填充
部分。谢谢你,汤姆。