【问题标题】:Difference with limit of NaNs between values与值之间的 NaN 限制的差异
【发布时间】:2020-05-07 17:04:14
【问题描述】:

我想计算连续值之间的差值(导数),例如:

   list   = 1,   3,   7,   6
list_diff = NaN, 2,   4,  -1

仅当值中间没有 NaN 时,上述情况才有效。在下面的案例中,我想知道年级差异,以了解学生的学习在一段时间内是如何演变的。问题是缺少一些成绩!我们仍然想计算该差异(仅当中间最多有 2 个缺失的成绩时)。

我该怎么做?

df:
      GRD1 GRD2 GRD3 GRD4 GRD5 GRD6 GRD7
001   1    6    5    9    1    7    9        
002   5    8    NaN  8'   NaN  NaN  2'         
003   7   *8*   NaN  NaN  NaN  *2*  6          
df_diff:
      GRD1 GRD2 GRD3 GRD4 GRD5 GRD6 GRD7
001   NaN  5    -1   4    -8    6    2        
002   NaN  3    NaN  0    NaN  NaN  -6'         
003   NaN  1    NaN  NaN  NaN *NaN*  4 

查看数据框 df:请注意学生 001 和 002,即使 NaN 位于中间,也会计算成绩之间的差异,因为 他们最多只有 2 个缺失的成绩 .例如。 2' - 8' = -6'

但是,学生 003 有 3 个缺失成绩的差距,因此,不会计算这种情况下的差值。例如。 *2* - *8* = *NaN*.

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用ffilllimit 参数仅在DataFrame.diff 之前前向填充2 个值,然后将0 差异替换为原始NaNs 为DataFrame.mask

    df = df.ffill(axis=1, limit=2).diff(axis=1).mask(df.isna())
    print (df)
       GRD1  GRD2  GRD3  GRD4  GRD5  GRD6  GRD7
    1   NaN   5.0  -1.0   4.0  -8.0   6.0   2.0
    2   NaN   3.0   NaN   0.0   NaN   NaN  -6.0
    3   NaN   1.0   NaN   NaN   NaN   NaN   4.0
    

    详情

    print (df.ffill(axis=1, limit=2))
       GRD1  GRD2  GRD3  GRD4  GRD5  GRD6  GRD7
    1   1.0   6.0   5.0   9.0   1.0   7.0   9.0
    2   5.0   8.0   8.0   8.0   8.0   8.0   2.0
    3   7.0   8.0   8.0   8.0   NaN   2.0   6.0
    
    print (df.ffill(axis=1, limit=2).diff(axis=1))
       GRD1  GRD2  GRD3  GRD4  GRD5  GRD6  GRD7
    1   NaN   5.0  -1.0   4.0  -8.0   6.0   2.0
    2   NaN   3.0   0.0   0.0   0.0   0.0  -6.0
    3   NaN   1.0   0.0   0.0   NaN   NaN   4.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-16
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多