我有这个数据框:
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_Var
、456_Var
、789_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_index
df_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))
为了获得正确的列名,在转换结果上称为重命名, 使用从原始列生成目标列名称的函数 名字。