pandas - 取当前和前一天之间的最小值 -rolling().min()

标签 pandas

我有这个数据框:

ID      Date  X  123_Var  456_Var  789_Var
 A  16-07-19  1      NaN      NaN      NaN
 A  17-07-19  7    777.0    250.0    810.0
 A  20-07-19  3      NaN      NaN      NaN
 A  21-07-19  4    295.0    272.0    490.0
 A  22-07-19  8    778.0    600.0    544.0
 A  25-07-19  8      NaN      NaN      NaN
 A  26-07-19  3    435.0    416.0    820.0
 A  27-07-19  8    590.0    455.0    342.0
 A  02-08-19  5      NaN      NaN      NaN
 A  03-08-19  5    717.0    211.0    454.0
 A  05-08-19  1      NaN      NaN      NaN
 A  07-08-19  2      NaN      NaN      NaN
 A  08-08-19  9    105.0    929.0    633.0
 B  09-08-19  6      NaN      NaN      NaN
 B  11-08-19  2      NaN      NaN      NaN
 B  12-08-19  7    413.0    725.0    414.0
 B  13-08-19  7    170.0    702.0    912.0
 B  14-08-19  2    851.0    616.0    477.0
 B  15-08-19  2    475.0    447.0    555.0
 B  17-08-19  3      NaN      NaN      NaN
 B  18-08-19  1    299.0    537.0    321.0

我想显示当天和前一天(使用 Date 列)值之间的最小值,其中 123_Var456_Var789_Var 列,通过 rolling().min() (或其他方式)。

如果没有要比较的值,则将填充 NaN 值。

这应该通过 group by 单独应用于每个 ID。

预期结果:

ID      Date  X  123_Var  456_Var  789_Var  123_Min_2  456_Min_2  789_Min_2
 A  16-07-19  1      NaN      NaN      NaN        NaN        NaN        NaN
 A  17-07-19  7    777.0    250.0    810.0      777.0      250.0      810.0
 A  20-07-19  3      NaN      NaN      NaN        NaN        NaN        NaN
 A  21-07-19  4    295.0    272.0    490.0      295.0      272.0      490.0
 A  22-07-19  8    778.0    600.0    544.0      295.0      272.0      490.0
 A  25-07-19  8      NaN      NaN      NaN        NaN        NaN        NaN
 A  26-07-19  3    435.0    416.0    820.0      435.0      416.0      820.0
 A  27-07-19  8    590.0    455.0    342.0      435.0      416.0      342.0
 A  02-08-19  5      NaN      NaN      NaN        NaN        NaN        NaN
 A  03-08-19  5    717.0    211.0    454.0      717.0      211.0      454.0
 A  05-08-19  1      NaN      NaN      NaN        NaN        NaN        NaN
 A  07-08-19  2      NaN      NaN      NaN        NaN        NaN        NaN
 A  08-08-19  9    105.0    929.0    633.0      105.0      929.0      633.0
 B  09-08-19  6      NaN      NaN      NaN        NaN        NaN        NaN
 B  11-08-19  2      NaN      NaN      NaN        NaN        NaN        NaN
 B  12-08-19  7    413.0    725.0    414.0      413.0      725.0      414.0
 B  13-08-19  7    170.0    702.0    912.0      170.0      702.0      414.0
 B  14-08-19  2    851.0    616.0    477.0      170.0      616.0      477.0
 B  15-08-19  2    475.0    447.0    555.0      475.0      447.0      477.0
 B  17-08-19  3      NaN      NaN      NaN        NaN        NaN        NaN
 B  18-08-19  1    299.0    537.0    321.0      299.0      537.0      321.0

最佳答案

经过评论的进一步解释,您可以尝试以下步骤。如果 Date 不在 datetime 中,则将其转换为 datetime dtype。将日期设置为索引。通过 offset 而不是整数进行滚动。

n = 2
cols = ['123_Var', '456_Var', '789_Var']
df.Date = pd.to_datetime(df.Date, dayfirst=True) #if `Date` already datetime dtype, skip this.
df = df.set_index('Date')
df1 = (df.groupby('ID').rolling(window=f'{n}D')[cols].min()
         .reset_index(0,drop=True).add_suffix(f'_min_{n}'))
df_final = df.join(df1)

Out[52]:
           ID  X  123_Var  456_Var  789_Var  123_Var_min_2  456_Var_min_2  \
Date
2019-07-16  A  1      NaN      NaN      NaN            NaN            NaN
2019-07-17  A  7    777.0    250.0    810.0          777.0          250.0
2019-07-20  A  3      NaN      NaN      NaN            NaN            NaN
2019-07-21  A  4    295.0    272.0    490.0          295.0          272.0
2019-07-22  A  8    778.0    600.0    544.0          295.0          272.0
2019-07-25  A  8      NaN      NaN      NaN            NaN            NaN
2019-07-26  A  3    435.0    416.0    820.0          435.0          416.0
2019-07-27  A  8    590.0    455.0    342.0          435.0          416.0
2019-08-02  A  5      NaN      NaN      NaN            NaN            NaN
2019-08-03  A  5    717.0    211.0    454.0          717.0          211.0
2019-08-05  A  1      NaN      NaN      NaN            NaN            NaN
2019-08-07  A  2      NaN      NaN      NaN            NaN            NaN
2019-08-08  A  9    105.0    929.0    633.0          105.0          929.0
2019-08-09  B  6      NaN      NaN      NaN            NaN            NaN
2019-08-11  B  2      NaN      NaN      NaN            NaN            NaN
2019-08-12  B  7    413.0    725.0    414.0          413.0          725.0
2019-08-13  B  7    170.0    702.0    912.0          170.0          702.0
2019-08-14  B  2    851.0    616.0    477.0          170.0          616.0
2019-08-15  B  2    475.0    447.0    555.0          475.0          447.0
2019-08-17  B  3      NaN      NaN      NaN            NaN            NaN
2019-08-18  B  1    299.0    537.0    321.0          299.0          537.0

            789_Var_min_2
Date
2019-07-16            NaN
2019-07-17          810.0
2019-07-20            NaN
2019-07-21          490.0
2019-07-22          490.0
2019-07-25            NaN
2019-07-26          820.0
2019-07-27          342.0
2019-08-02            NaN
2019-08-03          454.0
2019-08-05            NaN
2019-08-07            NaN
2019-08-08          633.0
2019-08-09            NaN
2019-08-11            NaN
2019-08-12          414.0
2019-08-13          414.0
2019-08-14          477.0
2019-08-15          477.0
2019-08-17            NaN
2019-08-18          321.0

n = 4

In [55]: df_final
Out[55]:
           ID  X  123_Var  456_Var  789_Var  123_Var_min_4  456_Var_min_4  \
Date
2019-07-16  A  1      NaN      NaN      NaN            NaN            NaN
2019-07-17  A  7    777.0    250.0    810.0          777.0          250.0
2019-07-20  A  3      NaN      NaN      NaN          777.0          250.0
2019-07-21  A  4    295.0    272.0    490.0          295.0          272.0
2019-07-22  A  8    778.0    600.0    544.0          295.0          272.0
2019-07-25  A  8      NaN      NaN      NaN          778.0          600.0
2019-07-26  A  3    435.0    416.0    820.0          435.0          416.0
2019-07-27  A  8    590.0    455.0    342.0          435.0          416.0
2019-08-02  A  5      NaN      NaN      NaN            NaN            NaN
2019-08-03  A  5    717.0    211.0    454.0          717.0          211.0
2019-08-05  A  1      NaN      NaN      NaN          717.0          211.0
2019-08-07  A  2      NaN      NaN      NaN            NaN            NaN
2019-08-08  A  9    105.0    929.0    633.0          105.0          929.0
2019-08-09  B  6      NaN      NaN      NaN            NaN            NaN
2019-08-11  B  2      NaN      NaN      NaN            NaN            NaN
2019-08-12  B  7    413.0    725.0    414.0          413.0          725.0
2019-08-13  B  7    170.0    702.0    912.0          170.0          702.0
2019-08-14  B  2    851.0    616.0    477.0          170.0          616.0
2019-08-15  B  2    475.0    447.0    555.0          170.0          447.0
2019-08-17  B  3      NaN      NaN      NaN          475.0          447.0
2019-08-18  B  1    299.0    537.0    321.0          299.0          447.0

            789_Var_min_4
Date
2019-07-16            NaN
2019-07-17          810.0
2019-07-20          810.0
2019-07-21          490.0
2019-07-22          490.0
2019-07-25          544.0
2019-07-26          820.0
2019-07-27          342.0
2019-08-02            NaN
2019-08-03          454.0
2019-08-05          454.0
2019-08-07            NaN
2019-08-08          633.0
2019-08-09            NaN
2019-08-11            NaN
2019-08-12          414.0
2019-08-13          414.0
2019-08-14          414.0
2019-08-15          414.0
2019-08-17          477.0
2019-08-18          321.0

注意:如果您需要将Date返回到列,只需在df_finalreset_index

df_final = df_final.reset_index()

关于pandas - 取当前和前一天之间的最小值 -rolling().min(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59921931/

相关文章:

python - 创建 future 的 DataFrame 日期列 - Pandas - Python

python - 数据框上的多个条件

python - 从 pandas 大数据集中获取犯罪 'count'

python - 从pandas中的多级groupby中进行选择

python - 在 pandas 中过滤混合数据类型列会导致错误

python - 打印 Pandas 数据框中每一列的唯一值

python - 在 pandas 数据框中用 0 填充缺失年份/季度的列

Pandas groupby 滚动删除索引列

python - pandas 使用 fill_method : Need to know data from which row was copied? 重新采样

python - 不同人的平均访问间隔