首页 文章

在多列上使用pandas fillna()

提问于
浏览
2

我是一个新的熊猫用户(截至昨天),并且有时发现它既方便又令人沮丧 .

我目前的沮丧是试图在数据帧的多个列上使用df.fillna() . 例如,我有两组部分重叠的数据(较新的集合和较旧的集合) . 对于我们有新数据的情况,我只是使用它,但如果没有更新的数据,我也想使用旧数据 . 看来我应该能够使用fillna()来填充较旧的列,但是我无法让它工作 .

尝试一个具体的例子:

df.ix[:,['newcolumn1','newcolumn2']].fillna(df.ix[:,['oldcolumn1','oldcolumn2']], inplace=True)

但这并没有像预期的那样起作用 - 数字显示在新的列中,这些列是NaN,但不是旧列中的数据(事实上,查看数据,我不知道它选择的数字在哪里来了来自,因为它们在新旧数据中都不存在) .

有没有办法用DataFrame中其他特定列的值填充DataFrame中特定列的NaN?

2 回答

  • 0

    回答你的问题:是的 . 看看使用fillna的 value 参数 . 与其他数据帧上的 to_dict() 方法一起使用 .

    But to really solve your problem ,看一下DataFrame的update()方法 . 假设您的两个数据帧具有相似的索引,我认为这正是您想要的 .

    In [36]: df = pd.DataFrame({'A': [0, np.nan, 2, 3, np.nan, 5], 'B': [1, 0, 1, np.nan, np.nan, 1]})
    
    In [37]: df
    Out[37]: 
        A   B
    0   0   1
    1 NaN   0
    2   2   1
    3   3 NaN
    4 NaN NaN
    5   5   1
    
    In [38]: df2 = pd.DataFrame({'A': [0, np.nan, 2, 3, 4, 5], 'B': [1, 0, 1, 1, 0, 0]})
    
    In [40]: df2
    Out[40]: 
        A  B
    0   0  1
    1 NaN  0
    2   2  1
    3   3  1
    4   4  0
    5   5  0
    
    In [52]: df.update(df2, overwrite=False)
    
    In [53]: df
    Out[53]: 
        A  B
    0   0  1
    1 NaN  0
    2   2  1
    3   3  1
    4   4  0
    5   5  1
    

    请注意,除了 (1, A) 之外, df 中的所有 NaN 都被替换,因为 df2 中的 NaN 也是 NaN . 还有一些像 (5, B) 这样的值在 dfdf2 之间有所不同 . 通过使用 overwrite=False ,它保持 df 的值 .

    编辑:基于评论,似乎您正在寻找一个解决方案,其中列名称不匹配两个DataFrames(如果您发布样本数据,它会很有帮助) . 让我们尝试一下,将C和B替换为A列 .

    In [33]: df = pd.DataFrame({'A': [0, np.nan, 2, 3, np.nan, 5], 'B': [1, 0, 1, np.nan, np.nan, 1]})
    
    In [34]: df2 = pd.DataFrame({'C': [0, np.nan, 2, 3, 4, 5], 'D': [1, 0, 1, 1, 0, 0]})
    
    In [35]: df
    Out[35]: 
        A   B
    0   0   1
    1 NaN   0
    2   2   1
    3   3 NaN
    4 NaN NaN
    5   5   1
    
    In [36]: df2
    Out[36]: 
        C  D
    0   0  1
    1 NaN  0
    2   2  1
    3   3  1
    4   4  0
    5   5  0
    
    In [37]: d = {'A': df2.C, 'B': df2.D}  # pass this values in fillna
    
    In [38]: df
    Out[38]: 
        A   B
    0   0   1
    1 NaN   0
    2   2   1
    3   3 NaN
    4 NaN NaN
    5   5   1
    
    In [40]: df.fillna(value=d)
    Out[40]: 
        A  B
    0   0  1
    1 NaN  0
    2   2  1
    3   3  1
    4   4  0
    5   5  1
    

    我想如果你花时间去学习大熊猫,你会减少挫折感 . 这是一个庞大的图书馆,所以需要时间 .

  • 2

    fillna 通常用于向前或向后进行观察 . 相反,我会使用 np.where ......如果我明白你在问什么 .

    import numpy as np
    np.where(np.isnan(df['newcolumn1']), df['oldcolumn1'], df['newcolumn1'])
    

相关问题