如何在 Pandas 中的间隔上应用 function/impute
How to apply a function/impute on an interval in Pandas
我有一个 Pandas 数据集,其中包含每月日期时间索引和一列未完成订单(如下所示):
Date
orders
1991-01-01
nan
1991-02-01
nan
1991-03-01
24
1991-04-01
nan
1991-05-01
nan
1991-06-01
nan
1991-07-01
nan
1991-08-01
34
1991-09-01
nan
1991-10-01
nan
1991-11-01
22
1991-12-01
nan
我想对值进行线性插值以填充 nans。然而,它必须在 6 个月的区块内应用(非滚动)。因此,例如,一个 6 个月的块将是 1991-01-01
和 1991-06-01
之间的所有行,我们将在其中进行前向和后向线性插补,这样如果存在 nan
,插值将下降到最终值 0。因此对于上面的相同数据集,我希望最终结果看起来如何:
Date
orders
1991-01-01
8
1991-02-01
16
1991-03-01
24
1991-04-01
18
1991-05-01
12
1991-06-01
6
1991-07-01
17
1991-08-01
34
1991-09-01
30
1991-10-01
26
1991-11-01
22
1991-12-01
11
然而,我不知道如何在 Pandas 中执行此操作。有什么想法吗?
想法是每 6 个月分组一次,添加和附加 0 个值,插值,然后删除每组第一个和最后一个 0 值:
df['Date'] = pd.to_datetime(df['Date'])
f = lambda x: pd.Series([0] + x.tolist() + [0]).interpolate().iloc[1:-1]
df['orders'] = (df.groupby(pd.Grouper(freq='6MS', key='Date'))['orders']
.transform(f))
print (df)
Date orders
0 1991-01-01 8.0
1 1991-02-01 16.0
2 1991-03-01 24.0
3 1991-04-01 18.0
4 1991-05-01 12.0
5 1991-06-01 6.0
6 1991-07-01 17.0
7 1991-08-01 34.0
8 1991-09-01 30.0
9 1991-10-01 26.0
10 1991-11-01 22.0
11 1991-12-01 11.0
我有一个 Pandas 数据集,其中包含每月日期时间索引和一列未完成订单(如下所示):
Date | orders |
---|---|
1991-01-01 | nan |
1991-02-01 | nan |
1991-03-01 | 24 |
1991-04-01 | nan |
1991-05-01 | nan |
1991-06-01 | nan |
1991-07-01 | nan |
1991-08-01 | 34 |
1991-09-01 | nan |
1991-10-01 | nan |
1991-11-01 | 22 |
1991-12-01 | nan |
我想对值进行线性插值以填充 nans。然而,它必须在 6 个月的区块内应用(非滚动)。因此,例如,一个 6 个月的块将是 1991-01-01
和 1991-06-01
之间的所有行,我们将在其中进行前向和后向线性插补,这样如果存在 nan
,插值将下降到最终值 0。因此对于上面的相同数据集,我希望最终结果看起来如何:
Date | orders |
---|---|
1991-01-01 | 8 |
1991-02-01 | 16 |
1991-03-01 | 24 |
1991-04-01 | 18 |
1991-05-01 | 12 |
1991-06-01 | 6 |
1991-07-01 | 17 |
1991-08-01 | 34 |
1991-09-01 | 30 |
1991-10-01 | 26 |
1991-11-01 | 22 |
1991-12-01 | 11 |
然而,我不知道如何在 Pandas 中执行此操作。有什么想法吗?
想法是每 6 个月分组一次,添加和附加 0 个值,插值,然后删除每组第一个和最后一个 0 值:
df['Date'] = pd.to_datetime(df['Date'])
f = lambda x: pd.Series([0] + x.tolist() + [0]).interpolate().iloc[1:-1]
df['orders'] = (df.groupby(pd.Grouper(freq='6MS', key='Date'))['orders']
.transform(f))
print (df)
Date orders
0 1991-01-01 8.0
1 1991-02-01 16.0
2 1991-03-01 24.0
3 1991-04-01 18.0
4 1991-05-01 12.0
5 1991-06-01 6.0
6 1991-07-01 17.0
7 1991-08-01 34.0
8 1991-09-01 30.0
9 1991-10-01 26.0
10 1991-11-01 22.0
11 1991-12-01 11.0