Pandas 如何用max()值填充数据帧

Pandas 如何用max()值填充数据帧,pandas,dataframe,Pandas,Dataframe,我有一个数据帧,每天7:00开始,22:10结束,间隔5分钟。 在df中大约有200天(周末和某些特定的日子除外) 我需要另一列,我们称之为“lastdayVolume”,其中包含前一天的最大容量值 例如,在2019-09-03年(7:00到22:10之间),单行中的最大体积值为50000,那么我需要在2019-09-04年的每一行中的“lastdayVolume”列中的值50000。 如何在不减少数据帧长度的情况下执行此操作?您尝试过吗 df.resample('1D', on='Date')

我有一个数据帧,每天7:00开始,22:10结束,间隔5分钟。
在df中大约有200天(周末和某些特定的日子除外)

我需要另一列,我们称之为“lastdayVolume”,其中包含前一天的最大容量值
例如,在2019-09-03年(7:00到22:10之间),单行中的最大体积值为50000,那么我需要在2019-09-04年的每一行中的“lastdayVolume”列中的值50000。
如何在不减少数据帧长度的情况下执行此操作?

您尝试过吗

df.resample('1D', on='Date').max()
这应该给你每天一行的最大值在这一天

编辑:要将其与旧数据合并,可以使用左连接。有点乱,但是

pd.merge(df, df.resample('1D', on='Date')['Volume'].max().rename('lastdayVolume'), left_on=pd.to_datetime((df['Date'] - pd.Timedelta('1d')).dt.date), right_index=True, how='left')
In [54]: pd.merge(df, df.resample('1D', on='Date')['Volume'].max().rename('lastdayVolume'), left_on=pd.to_datetime((df['Date'] - pd.Timedelta('1d')).dt.date), right_index=True, how='left')                       
Out[54]: 
                 Date   Time  Volume  lastdayVolume
0 2019-09-03 07:00:00  70000     778          800.0
1 2019-09-03 07:05:00  70500    1267          800.0
2 2019-09-03 07:10:00  71000    1208          800.0
3 2019-09-03 07:15:00  71500     715          800.0
4 2019-09-03 07:20:00  72000     372          800.0
0 2019-09-02 08:00:00  70000     800            NaN
看起来很好

同样地,您可以使用稍短的

df.join(df.resample('1D', on='Date')['Volume'].max().rename('lastdayVolume'), on=pd.to_datetime((df['Date'] - pd.Timedelta('1d')).dt.date))
在这里

第一个数据帧是您的旧数据帧,第二个是我上面计算的数据帧(经过适当的重命名)。对于要合并的值,请使用包含时间戳的
'Date'
列,将其偏移一天并转换为左侧的实际日期。在右边,只需使用索引即可。 如果前一天没有事务,左连接可确保不会意外删除行

编辑2:要找出特定时间范围内的最大值,可以使用

df.set_index('Date').between_time('15:30:00', '22:10:00')
过滤数据帧。然后像以前一样重新采样

df.join(df.set_index('Date').between_time('15:30:00', '22:10:00').resample('1D')...

当日期进入索引时,重采样中的
on
参数不再是必需的。

抱歉,我忘了在问题中提到,数据帧的长度不能更改。您仍将以相同的方式计算最大值,并通过联接将其与旧数据帧合并。我编辑了答案,很有效!非常感谢。你有没有一个解决方案,不是从一整天,而是从前一天的15:30到22:10获得最大值?这个问题一直在给出;)我再次编辑了它。不幸的是,这两种解决方案在我的大数据框架上都不起作用。我得到了大约五分之一的行的NaN。由于您的问题特定于前几天的
,您可能应该包含至少有2天的示例数据。是的,这会很有帮助
df.join(df.set_index('Date').between_time('15:30:00', '22:10:00').resample('1D')...