如何用Pandas DataFrame列的前有效值填充合并产生的NaN?
解决合并DataFrame后用前值填充NaN的问题
一、用前值填充NaN的实现
你可以直接使用Pandas的ffill()(向前填充)方法,将指定列的NaN用最近的非缺失值填充。修改后的完整代码如下:
import pandas as pd import numpy as np dflist = [[1, "a", "b"], [2, "a", "b"], [3, "a", "b"]] df = pd.DataFrame(dflist) dflist1 = [[1, "a", "b", "c", "e"], [1, "a", "b", "c", "e"], [2, "a", "b", "c", "e"], [3, "a", "b", "c", "e"], [1, "a", "b", "c", "e"],[4, "a", "b", "c", "e"], [5, "a", "b", "c", "e"]] df1 = pd.DataFrame(dflist1) df.columns = ["col1", "col2", "col3"] df1.columns = ["col1", "col21", "col31", "col45", "col56"] result = pd.merge(df1, df, how='outer') # 对col2和col3执行向前填充 result[['col2', 'col3']] = result[['col2', 'col3']].ffill() print(result)
执行后就能得到你想要的输出:
col1 col21 col31 col45 col56 col2 col3 0 1 a b c e a b 1 1 a b c e a b 2 1 a b c e a b 3 2 a b c e a b 4 3 a b c e a b 5 4 a b c e a b 6 5 a b c e a b
ffill()的作用是沿着列的方向,用最近的非NaN值填充后续的缺失值,完全匹配你"用对应列的前一个有效值填充"的需求。
二、修正获取NaN索引的代码
你之前的代码错误在于,result['col3'].isna()[0]是取布尔数组的第一个元素,变成了单个布尔值,导致np.where无法找到正确的NaN位置。正确写法如下:
# 获取col3中NaN的索引 indices = list(np.where(result['col3'].isna())[0]) print(indices)
执行后会输出[5, 6],也就是col3中NaN所在的行索引。
内容的提问来源于stack exchange,提问作者Gravity Mass
相关产品推荐
相关产品推荐

