You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python脚本基于最近created_dt记录填充name列缺失值

按Item+Type匹配最近时间非空记录填充缺失Name的Python实现

需求说明

按item和type分组,为每条name为空的记录,匹配同组内created_dt不早于当前记录且最近的非空name值进行填充;若同组无符合条件的非空记录,则保留空值。

输入数据

itemtypenamecreated_dt
a1bb2023-06-01 21:00:00
a12023-06-01 23:00:00
b1cat2023-06-01 11:00:00
c12023-06-02 01:00:00
a2tiff2023-06-01 23:30:00
d22023-06-06 09:00:00
a1ali2023-06-02 00:00:00
c2don2023-06-02 01:00:00

预期输出

itemtypenamecreated_dt
a1bb2023-06-01 21:00:00
a1ali2023-06-01 23:00:00
b1cat2023-06-01 11:00:00
c12023-06-02 01:00:00
a2tiff2023-06-01 23:30:00
d22023-06-06 09:00:00
a1ali2023-06-02 00:00:00
c2don2023-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))

关键逻辑说明

  1. 时间类型转换:必须将created_dt转为datetime,避免字符串比较的逻辑错误。
  2. 分组匹配:通过groupby(['item', 'type'])限定只在同组内查找匹配记录。
  3. 最近记录筛选:对空name记录,只找时间不早于它的非空name,再取其中时间最早的(即最接近当前记录的后续记录)。
  4. 顺序恢复:最后通过原索引还原行顺序,保证输出和输入的行排列一致。

内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 16:37:29