如何在Pandas中按索引匹配,用指定Series填充多列NaN值?
用同一Series按索引匹配填充DataFrame多列NaN值的Pythonic实现
问题描述
我希望使用fillna命令,按索引匹配,用同一个Series填充Pandas DataFrame的多列NaN值。现有代码如下:
import numpy as np import pandas as pd df_1 = pd.DataFrame(index = [0, 1, 2], columns = ['a', 'b', 'c'], data = [[1, np.NaN, np.NaN], [2, np.NaN, 4], [np.NaN, 2, -3]]) series_1 = pd.Series([6, 5, 4], index = [0, 1, 2]) df_2 = df_1.fillna(series_2) # ???
期望输出为:
df_2 = pd.DataFrame(index = [0, 1, 2], columns = ['a', 'b', 'c'], data = [[1, 6, 6], [2, 5, 4], [4, 2, -3]])
有没有无需逐列调用fillna的Pythonic实现方式?
解决方案
方法1:将Series转换为同结构DataFrame后填充
把目标Series扩展成和原DataFrame列数一致、索引匹配的DataFrame,再直接用fillna填充:
import numpy as np import pandas as pd df_1 = pd.DataFrame(index=[0, 1, 2], columns=['a', 'b', 'c'], data=[[1, np.NaN, np.NaN], [2, np.NaN, 4], [np.NaN, 2, -3]]) series_1 = pd.Series([6, 5, 4], index=[0, 1, 2]) # 生成和原DataFrame列数匹配的填充DataFrame fill_df = pd.DataFrame({col: series_1 for col in df_1.columns}) df_2 = df_1.fillna(fill_df)
方法2:用apply批量处理列
直接对DataFrame的每一列应用fillna,利用fillna自动按索引匹配的特性,一行代码搞定:
df_2 = df_1.apply(lambda col: col.fillna(series_1))
两种方法都无需逐列手动调用fillna,简洁高效,运行后均可得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Faraz Masroor
相关产品推荐
相关产品推荐

