代码之家  ›  专栏  ›  技术社区  ›  Mohamed Thasin ah

在两个列中填写NaN,或者选择当前值

  •  1
  • Mohamed Thasin ah  · 技术社区  · 6 年前

    例如, 输入:

           col1      col2
    0  3.375000  4.075000
    1  2.450000  1.567100
    2       NaN       NaN
    3  3.248083       NaN
    4       NaN  2.335725
    5  2.150000  3.218750
    

           col1      col2
    0  3.375000  4.075000
    1  2.450000  1.567100
    2       NaN       NaN
    3  3.248083  3.248083
    4  2.335725  2.335725
    5  2.150000  3.218750
    

    print df.T.fillna(method='bfill').fillna(method='ffill').T
    

    上面给出了一个必需的结果,但我认为我给代码增加了更多的复杂性。还有其他更好的方法吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   cs95 abhishek58g    6 年前

    您不必转置,可以指定一个轴:

    df.ffill(1).bfill(1)
    
           col1      col2
    0  3.375000  4.075000
    1  2.450000  1.567100
    2       NaN       NaN
    3  3.248083  3.248083
    4  2.335725  2.335725
    5  2.150000  3.218750
    

    如果您有多个列,但不想接触其中的某些列,则可以进行切片、填充和重新指定。

    df
           col1      col2  col3
    0  3.375000  4.075000   NaN
    1  2.450000  1.567100   2.0
    2       NaN       NaN   3.0
    3  3.248083       NaN   5.0
    4       NaN  2.335725   NaN
    5  2.150000  3.218750   5.0
    
    include = ['col1', 'col2']
    # Or,
    # exclude = ['col3']
    # include = df.columns.difference(exclude)
    df[include] = df[include].ffill(1).bfill(1)
    
    df
    
           col1      col2  col3
    0  3.375000  4.075000   NaN
    1  2.450000  1.567100   2.0
    2       NaN       NaN   3.0
    3  3.248083  3.248083   5.0
    4  2.335725  2.335725   NaN
    5  2.150000  3.218750   5.0
    

    如果只有两列,也可以使用 combine_first

    df.col1 = df.col1.combine_first(df.col2) 
    df.col2 = df.col2.combine_first(df.col1)
    
           col1      col2
    0  3.375000  4.075000
    1  2.450000  1.567100
    2       NaN       NaN
    3  3.248083  3.248083
    4  2.335725  2.335725
    5  2.150000  3.218750