使用 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
我有一个看起来像这样的数据框:
+---+----+---------------+------------+------------+
| | 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