【问题标题】:Fill NaN based on previous value of row根据行的先前值填充 NaN
【发布时间】:2019-08-27 13:07:33
【问题描述】:

我有一个数据框(样本,不是真实的):

df =

    A   B   C    D   E     F       

0   3   4   NaN  NaN NaN   NaN  
1   9   8   NaN  NaN NaN   NaN      
2   5   9   4    7   NaN   NaN  
3   5   7   6    3   NaN   NaN  
4   2   6   4    3   NaN   NaN  

现在我想用行的前几个(!!!)值填充 NaN 值(用左现有的几个数字填充 Nan 并应用于整行)并将其应用于整个数据集。

  • 有很多关于填充列的答案。但在 这种情况我需要根据行来填写。
  • 也有关于基于其他列的填充 NaN 的答案,但是 在我的情况下,列数超过 2000。这是示例数据

期望的输出是:

df =

   A  B   C  D  E  F  

0  3  4   3  4  3  4  
1  9  8   9  8  9  8  
2  5  9   4  7  4  7      
3  5  7   6  3  6  3  
4  2  6   4  3  4  3  

【问题讨论】:

  • 如果整行都填满了NaN,或者只有第一列不是NaN,会发生什么?
  • @DeepSpace idk。在我的数据集中,我至少有一对值。数据集中没有完整的 NaN 行
  • 行首是否有NaN 值?

标签: python pandas


【解决方案1】:

IIUC,无需重塑数据的快速解决方案:

df.iloc[:,::2] = df.iloc[:,::2].ffill(1)
df.iloc[:,1::2] = df.iloc[:,1::2].ffill(1)
df

输出:

   A  B  C  D  E  F
0  3  4  3  4  3  4
1  9  8  9  8  9  8
2  5  9  4  7  4  7
3  5  7  6  3  6  3
4  2  6  4  3  4  3

【讨论】:

    【解决方案2】:

    想法是重塑 DataFrame 以使用 stack 和数组的 2 的模数和整数除法按列的长度进行可能的正向和反向填充缺失值:

    c = df.columns 
    a = np.arange(len(df.columns))
    df.columns = [a // 2, a % 2]
    
    #if possible some pairs missing remove .astype(int)
    df1 = df.stack().ffill(axis=1).bfill(axis=1).unstack().astype(int)
    df1.columns = c
    print (df1)
       A  B  C  D  E  F
    0  3  4  3  4  3  4
    1  9  8  9  8  9  8
    2  5  9  4  7  4  7
    3  5  7  6  3  6  3
    4  2  6  4  3  4  3
    

    详情

    print (df.stack())
         0    1   2
    0 0  3  NaN NaN
      1  4  NaN NaN
    1 0  9  NaN NaN
      1  8  NaN NaN
    2 0  5  4.0 NaN
      1  9  7.0 NaN
    3 0  5  6.0 NaN
      1  7  3.0 NaN
    4 0  2  4.0 NaN
      1  6  3.0 NaN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 2018-03-28
      • 2014-11-05
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多