如何用Python脚本基于最近created_dt记录填充name列缺失值
按Item+Type匹配最近时间非空记录填充缺失Name的Python实现
需求说明
按item和type分组,为每条name为空的记录,匹配同组内created_dt不早于当前记录且最近的非空name值进行填充;若同组无符合条件的非空记录,则保留空值。
输入数据
| item | type | name | created_dt |
|---|---|---|---|
| a | 1 | bb | 2023-06-01 21:00:00 |
| a | 1 | 2023-06-01 23:00:00 | |
| b | 1 | cat | 2023-06-01 11:00:00 |
| c | 1 | 2023-06-02 01:00:00 | |
| a | 2 | tiff | 2023-06-01 23:30:00 |
| d | 2 | 2023-06-06 09:00:00 | |
| a | 1 | ali | 2023-06-02 00:00:00 |
| c | 2 | don | 2023-06-02 01:00:00 |
预期输出
| item | type | name | created_dt |
|---|---|---|---|
| a | 1 | bb | 2023-06-01 21:00:00 |
| a | 1 | ali | 2023-06-01 23:00:00 |
| b | 1 | cat | 2023-06-01 11:00:00 |
| c | 1 | 2023-06-02 01:00:00 | |
| a | 2 | tiff | 2023-06-01 23:30:00 |
| d | 2 | 2023-06-06 09:00:00 | |
| a | 1 | ali | 2023-06-02 00:00:00 |
| c | 2 | don | 2023-06-02 01:00:00 |
Python实现脚本(基于Pandas)
import pandas as pd # 构造输入数据(实际场景可替换为pd.read_csv等读取方式) df = pd.DataFrame({ 'item': ['a', 'a', 'b', 'c', 'a', 'd', 'a', 'c'], 'type': [1, 1, 1, 1, 2, 2, 1, 2], 'name': ['bb', '', 'cat', '', 'tiff', '', 'ali', 'don'], 'created_dt': ['2023-06-01 21:00:00', '2023-06-01 23:00:00', '2023-06-01 11:00:00', '2023-06-02 01:00:00', '2023-06-01 23:30:00', '2023-06-06 09:00:00', '2023-06-02 00:00:00', '2023-06-02 01:00:00'] }) # 转换时间列为datetime类型,确保时间比较准确 df['created_dt'] = pd.to_datetime(df['created_dt']) # 分组处理函数:针对每个item+type组填充缺失name def fill_group_missing(group): # 按时间排序,方便后续匹配最近记录 sorted_group = group.sort_values('created_dt').reset_index(drop=True) # 提取组内所有非空name的记录(时间+name) valid_records = sorted_group[sorted_group['name'] != ''][['created_dt', 'name']] # 遍历每条记录,填充空name for idx, row in sorted_group.iterrows(): if row['name'] == '': # 筛选出时间 >= 当前记录的非空name候选 matches = valid_records[valid_records['created_dt'] >= row['created_dt']] if not matches.empty: # 取时间最早的候选(即最近的后续记录)填充 closest_match = matches.sort_values('created_dt').iloc[0] sorted_group.loc[idx, 'name'] = closest_match['name'] return sorted_group # 分组应用填充函数,并恢复原数据的行顺序 filled_df = df.groupby(['item', 'type'], group_keys=False).apply(fill_group_missing) filled_df = filled_df.loc[df.index] # 输出结果(可替换为to_csv/to_excel保存) print(filled_df.to_markdown(index=False))
关键逻辑说明
- 时间类型转换:必须将
created_dt转为datetime,避免字符串比较的逻辑错误。 - 分组匹配:通过
groupby(['item', 'type'])限定只在同组内查找匹配记录。 - 最近记录筛选:对空name记录,只找时间不早于它的非空name,再取其中时间最早的(即最接近当前记录的后续记录)。
- 顺序恢复:最后通过原索引还原行顺序,保证输出和输入的行排列一致。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

