我有这个数据框:
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_Var
、456_Var
、789_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_final
上reset_index
df_final = df_final.reset_index()
关于pandas - 取当前和前一天之间的最小值 -rolling().min(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59921931/