Python 获取下一个组值并将其分配给当前组元素
我的示例df如下所示: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
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填充部分。谢谢你,汤姆。