如何在Pandas中为大DataFrame添加变量并填充缺失观测值
解决DataFrame合并并填充缺失值的问题
我明白你的需求啦!你之前尝试的merge操作应该是用了默认的内连接(inner join),所以只保留了两个DataFrame共有的139条数据,但你需要的是保留CITATIONS全部668条观测,同时把ENFORE里的Enfore值匹配过去,不匹配的就填充成'X'。下面给你两种可行的解决方案:
方法一:左连接+填充缺失值
用pd.merge的左连接模式(how='left'),以CITATIONS作为左表,这样就能完整保留它的所有行,然后把匹配不到的Enfore值替换成'X':
# 左连接两个DataFrame,保留CITATIONS的所有行 citations_with_enfore = pd.merge(CITATIONS, ENFORE, on='citation', how='left') # 将Enfore列的缺失值(NaN)填充为'X' citations_with_enfore['Enfore'] = citations_with_enfore['Enfore'].fillna('X')
方法二:字典映射法
先把ENFORE转换成{citation: Enfore}的字典,再通过映射快速给CITATIONS添加Enfore列,最后填充缺失值:
# 将ENFORE转换为citation到Enfore的映射字典 enfore_mapping = ENFORE.set_index('citation')['Enfore'].to_dict() # 给CITATIONS添加Enfore列,匹配不到的用'X'填充 CITATIONS['Enfore'] = CITATIONS['citation'].map(enfore_mapping).fillna('X')
为什么之前的方法不对?
默认的pd.merge()使用的是内连接(inner join),只会返回两个DataFrame中citation列完全匹配的行,所以你得到的结果只有139条。而左连接(left join)会保留左表(这里是CITATIONS)的所有行,右表(ENFORE)中匹配不上的字段就会显示为NaN,之后用fillna('X')就能把这些缺失值替换成你需要的标记啦。
最终你得到的DataFrame应该有668条观测,其中139条的Enfore值是0或1,其余的都是'X',完全符合你的需求~
内容的提问来源于stack exchange,提问作者Graham Streich
相关产品推荐
相关产品推荐

