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



我有这个数据框:

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

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

如果没有要比较的值,则将填充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中,请将它转换为日期时间 dtype。将Date设置为索引。按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返回列,只需reset_indexdf_final

df_final = df_final.reset_index()

若要计算单个列的最小值,请定义以下函数:

def min2(col):
return pd.concat([col.dropna(), col.shift()], axis=1,
join='inner').min(axis=1).reindex(col.index)

然后加入原始数据帧及其转换的结果 最后 3 列(使用此函数(:

df = df.join(df.iloc[:, -3:].transform(min2).rename(
mapper=lambda col: col.replace('Var', 'Min_2'), axis=1))

为了获得正确的列名,在转换结果上称为重命名, 使用从原始列生成目标列名称的函数 名字。