如何高效地从存在缺失值的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
相关产品推荐
相关产品推荐

