如何高效填充Pandas DataFrame缺失行并移除无关行?
高效清理DataFrame无关行并补充缺失行优化方案
问题背景
我获取的DataFrame既包含无关行,又频繁存在缺失行。希望高效移除无关行并补充缺失行,以下示例代码的最后一行赋值语句在真实数据上执行耗时约30秒,求更优实现方法(注:实际缺失行无固定规律)。
示例代码
# df1包含无关行(index > 4),且仅存在偶数索引的数据 # df1是黑盒生成的,无法修改其生成逻辑 df1 = pd.DataFrame(index = [0,2,4,6,8], columns=['Data'], data=['a', 'b', 'c', 'd', 'e']) # 构造目标DataFrame,索引为需要保留的所有行 df2 = pd.DataFrame(index = [0,1,2,3,4], columns=['Data']) # 这行赋值执行缓慢 df2['Data'] = df1['Data'] return df2
期望结果
Data 0 a 1 NaN 2 b 3 NaN 4 c
优化方案
原方法的问题在于手动创建空DataFrame后赋值,会触发多次低效的索引对齐操作。推荐使用pandas内置的reindex方法,它专门针对索引对齐和缺失值补充做了优化,是向量化操作,效率远高于手动赋值。
方法1:筛选目标索引后reindex
先从df1中筛选出属于目标索引的行,再用目标索引列表重新对齐,自动补充缺失值:
df1 = pd.DataFrame(index=[0,2,4,6,8], columns=['Data'], data=['a', 'b', 'c', 'd', 'e']) target_index = [0,1,2,3,4] # 筛选出df1中在目标索引范围内的行,再重新索引到目标列表 df2 = df1[df1.index.isin(target_index)].reindex(target_index)
方法2:连续范围索引简化写法
如果目标索引是连续范围(比如示例中的0到4),可以直接用loc筛选后再reindex,代码更简洁:
df2 = df1.loc[:4].reindex([0,1,2,3,4])
两种方法都能得到和预期一致的结果,且执行速度会大幅提升——reindex是pandas底层优化的操作,避免了手动赋值带来的额外开销,在大数据量场景下优势尤为明显。
内容的提问来源于stack exchange,提问作者irh
相关产品推荐
相关产品推荐

