如何用另一DataFrame的lead_id填充leads的id列空值且保留原值
解决方案:用target的lead_id填充leads的id空值(保留原有非空值)
核心需求是仅覆盖leads中id列的NaN值,保留已有非空id,同时适配两个DataFrame长度不一致的情况,以下是具体实现步骤:
步骤1:定位需要填充的空值位置
先获取leads中id列为空的布尔掩码:
null_mask = leads['id'].isna()
步骤2:生成匹配填充数量的lead_id序列
由于leads的空值数量(约28.5万)多于target的行数(约26.6万),需要重复target的lead_id来满足填充需求:
# 计算需要填充的空值总数 fill_count = null_mask.sum() # 生成足够长度的填充序列,重复target的lead_id直到满足数量 fill_values = target['lead_id'].repeat((fill_count // len(target)) + 1).iloc[:fill_count].values
步骤3:填充空值(保留原有非空值)
通过布尔掩码定位空值位置,直接赋值:
leads.loc[null_mask, 'id'] = fill_values
简化写法
也可以用fillna直接结合生成的填充序列,一行完成:
# 生成与leads长度一致的填充序列 fill_series = pd.Series(target['lead_id'].repeat((len(leads) // len(target)) + 1).iloc[:len(leads)]) # 仅填充空值,保留原有id leads['id'] = leads['id'].fillna(fill_series)
为什么concat不行?
concat是用于拼接DataFrame的行/列,不是针对空值的填充操作,会导致列合并或行堆叠,进而覆盖原有数据或打乱结构,完全不符合需求。
内容的提问来源于stack exchange,提问作者mouhamad
相关产品推荐
相关产品推荐

