使用 groupby 方法填充缺失日期列

Filling Missing Date Column using groupby method

我有一个看起来像这样的数据框:


+---+----+---------------+------------+------------+
|   | id |     date1     |   date2    | days_ahead |
+---+----+---------------+------------+------------+
| 0 |  1 |    2021-10-21 | 2021-10-24 | 3          |
| 1 |  1 |    2021-10-22 | NaN        | NaN        |
| 2 |  1 |    2021-11-16 | 2021-11-24 | 8          |
| 3 |  2 |    2021-10-22 | 2021-10-24 | 2          |
| 4 |  2 |    2021-10-22 | 2021-10-24 | 2          |
| 5 |  3 |    2021-10-26 | 2021-10-31 | 5          |
| 6 |  3 |    2021-10-30 | 2021-11-04 | 5          |
| 7 |  3 |    2021-11-02 | NaN        | NaN        |
| 8 |  3 |    2021-11-04 | 2021-11-04 | 0          |
| 9 |  4 |    2021-10-28 | NaN        | NaN        |
+---+----+---------------+------------+------------+

我正在尝试用每个 id 组的 days_ahead 中位数来填充缺失的数据,

例如:
id 的中位数 1 = 5.5 四舍五入为 6
date2 在索引 1 的填充值 应该是 2021-10-28

同样,对于id 3 Median = 5
date2 在索引 7 的填充值 应该是 2021-11-07

而且, 对于 id 4 中位数 = NaN
date2 在索引 9 的填充值 应该是 2021-10-28


我试过了

df['date2'].fillna(df.groupby('id')['days_ahead'].transform('median'), inplace = True)

但这填充了 int 值。

虽然我可以使用lambda和apply方法来识别int并把它转为date,但是如何直接同时使用groupby和fillna呢?

您可以使用转换 to_timedelta 舍入值,使用 fill_value 参数添加到 date1 并替换缺失值:

df['date1'] = pd.to_datetime(df['date1'])
df['date2'] = pd.to_datetime(df['date2'])

td = pd.to_timedelta(df.groupby('id')['days_ahead'].transform('median').round(), unit='d')
df['date2'] = df['date2'].fillna(df['date1'].add(td, fill_value=pd.Timedelta(0)))

print (df)
   id      date1      date2  days_ahead
0   1 2021-10-21 2021-10-24         3.0
1   1 2021-10-22 2021-10-28         NaN
2   1 2021-11-16 2021-11-24         8.0
3   2 2021-10-22 2021-10-24         2.0
4   2 2021-10-22 2021-10-24         2.0
5   3 2021-10-26 2021-10-31         5.0
6   3 2021-10-30 2021-11-04         5.0
7   3 2021-11-02 2021-11-07         NaN
8   3 2021-11-04 2021-11-04         0.0
9   4 2021-10-28 2021-10-28         NaN