如何用max()值填充熊猫数据框

时间:2020-06-24 12:29:05

标签: pandas dataframe

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

        Date                Time    Volume
    0   2019-09-03 07:00:00 70000   778
    1   2019-09-03 07:05:00 70500   1267
    2   2019-09-03 07:10:00 71000   1208
    3   2019-09-03 07:15:00 71500   715
    4   2019-09-03 07:20:00 72000   372

我需要另一列,我们将其称为“ lastdayVolume”,其中包含前一天的Volume的最大值
例如,在2019-09-03(7:00和22:10之间)中,单行的最大交易量值为50000,那么我需要在2019-09-04的每一行中'lastdayVolume'列中的值50000 。
您如何在不降低数据框长度的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

您尝试过

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))

这里。

第一个DataFrame是您的旧数据框架,第二个是我上面计算出的数据框架(带有适当的重命名)。要使这些值合并,请使用包含时间戳记的'Date'列,将其偏移一天,然后转换为左侧的实际日期。在右侧,只需使用索引。 左联接确保您不会在前一天没有事务的情况下意外删除行。

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

df.set_index('Date').between_time('15:30:00', '22:10:00')

过滤DataFrame。然后像以前一样重新采样

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

随着日期进入索引,不再需要重采样中的on参数。