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

如何高效地从存在缺失值的Pandas DataFrame生成完整的DataFrame?

如何高效地从存在缺失值的Pandas DataFrame生成完整的DataFrame?

嗨,你现在用循环实现需求虽然能得到正确结果,但确实不够高效——Pandas本身提供了很多向量化的内置函数,能帮你用更简洁、更快的代码搞定这个需求,下面给你介绍两种常用的高效方法:

方法一:使用map快速匹配填充

这是最简洁的方式,核心思路是先把df1转换成以col1为索引的Series,再用df2的col1去映射对应的col2值,最后补上默认的0:

import pandas as pd
import numpy as np

# 你的原始数据
df1 = pd.DataFrame({'col1':[1,4,5,7],'col2':[10,20,30,2]})
df2 = pd.DataFrame({'col1':np.arange(1,8,1),'col2':0})

# 高效填充
df2['col2'] = df2['col1'].map(df1.set_index('col1')['col2']).fillna(0)

解释一下:

  • df1.set_index('col1')['col2']会生成一个以col1的数值为索引、对应col2值为内容的Series;
  • map方法会根据df2的col1值,自动匹配这个Series里对应的col2值,匹配不到的位置会返回NaN;
  • fillna(0)把这些NaN替换成你需要的默认值0,一步完成填充。

方法二:使用merge合并后填充

如果你更习惯用合并的思路,也可以用merge来实现:

# 合并两个DataFrame,保留df2的所有行
merged_df = df2.merge(df1, on='col1', how='left', suffixes=('_default', '_original'))
# 用原始数据填充,没有匹配到的保留默认值
merged_df['col2'] = merged_df['col2_original'].fillna(merged_df['col2_default'])
# 删除多余的辅助列
merged_df = merged_df.drop(['col2_default', 'col2_original'], axis=1)

这种方法逻辑更直观,适合需要查看中间合并结果的场景,同样是向量化操作,效率远高于循环。

这两种方法都避免了逐行循环的低效问题,尤其是当你的数据量很大时,性能差距会非常明显——Pandas的内置向量化函数是基于底层优化的,比Python循环快几十甚至上百倍哦!

备注:内容来源于stack exchange,提问作者Stef1611

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:44:34