根据条件给观测值赋值:相同visitor对应的id_user缺失值填充
Pandas同visitor缺失id_user填充方案
原代码问题说明
原实现存在两个核心逻辑错误:
zip(full_user['visitor'], missing_user['visitor'])是按两个DataFrame的行顺序逐行配对,不会按visitor的实际值做关联匹配,只有两个表的visitor排序完全一致时才可能命中匹配,通用性为0- 匹配成功后直接对
missing_user['id_user']整列赋值,会批量覆盖所有缺失行的id_user,完全不符合逐行匹配填充的需求
最优解决方案
不需要拆分两个DataFrame做遍历,直接使用pandas内置的分组填充操作即可实现需求,性能远高于自定义for循环。
方案1:分组前后填充(代码最简洁)
如果同一个visitor对应的非空id_user唯一,直接用分组填充即可:
import pandas as pd # 按visitor分组后,对id_user列做前向+后向填充,覆盖同组所有缺失值 df['id_user'] = df.groupby('visitor')['id_user'].transform(lambda x: x.ffill().bfill())
方案2:映射表填充(逻辑更直观)
先构建visitor到非空id_user的映射表,再用映射表填充缺失值:
# 构建visitor -> 非空id_user的唯一映射 user_mapping = df.dropna(subset=['id_user']).drop_duplicates('visitor').set_index('visitor')['id_user'] # 用映射表填充缺失的id_user df['id_user'] = df['id_user'].fillna(df['visitor'].map(user_mapping))
内容的提问来源于stack exchange,提问作者Cristi Chiticariu
相关产品推荐
相关产品推荐

