【问题标题】:Replace last non NaN value in row替换行中最后一个非 NaN 值
【发布时间】:2020-07-15 11:03:39
【问题描述】:

我想用 NaN 值替换数据框中行中所有最后的非 NaN。我的数据框中有 300 行和 1068 列。并且每一行都有不同数量的有效值,并用 NaN 填充。 这是一行的示例:

数据框中的一行 = [1 2 3 NaN NaN NaN] 输出=[1 2 NaN NaN NaN NaN]

如何替换 CSV 文件中行中最后一个非 NaN 值?

【问题讨论】:

  • 我假设您的意思是序列中的最后一个nan?也就是说,使用上面链接中的建议更新您的问题,您将获得一个解决方案。
  • @yatu 对有问题的错误表示抱歉。我现在已经编辑了。

标签: python pandas numpy dataframe


【解决方案1】:

这是一个基于 numpy 的:

import numpy as np
df = pd.DataFrame([[1, 2, 3, np.nan, np.nan, np.nan], [1, 2, 3, np.nan, np.nan, 2]])

您可以对值数组进行切片,并将其倒序排列,然后查找第一个有效值。然后获取索引,并使用np.put_along_axis 将它们设置为NaNs:

a = df.to_numpy()
m = a.shape[1]-1 - np.argmax(~np.isnan(a[:,::-1]), axis=1)
np.put_along_axis(a, m[:,None], np.nan, axis=1)
df[:] = a

print(df)

     0    1    2   3   4   5
0  1.0  2.0  NaN NaN NaN NaN
1  1.0  2.0  3.0 NaN NaN NaN

更多细节-

第一步是找到 NaN 的位置。由于我们想要最后一个有效值,我们应该从最后开始。所以切片得到列颠倒的数组,并使用np.isnan

np.isnan(a[:,::-1])
array([[ True,  True,  True, False, False, False],
       [False,  True,  True, False, False, False]])

现在我们可以使用np.argmax找到第一个False,即最后一个有效值:

np.argmax(~np.isnan(a[:,::-1]), axis=1)
# array([3, 0], dtype=int64)

现在通过减去上面的 col 长度,我们得到实际的索引:

a.shape[1]-1 - np.argmax(~np.isnan(a[:,::-1]), axis=1)
# array([2, 5], dtype=int64)

现在我们可以在对应的索引中将这些索引设置为NaN

np.put_along_axis(a, m[:,None], np.nan, axis=1)

【讨论】:

    【解决方案2】:

    枚举列并检查循环中的值是否为 NaN:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame([
    [1, 2, 3, np.NaN, np.NaN, 2]
    ], columns=["a", "b", "c", "d", "e", "f"]
    )
    
    j = 0
    for idx, c in enumerate(df.columns):
        if df[c].isna().any():
            while df.iloc[:, idx - j].isna().any():
                j += 1
            df.iloc[:, idx - j] = np.nan
    
    print(df)
    

    返回:

       a   b   c   d   e  f
    0  1 NaN NaN NaN NaN  2
    

    编辑:插入了太多的 NaN。将尝试修复它,否则删除答案..

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 2013-06-18
      • 2017-08-25
      • 1970-01-01
      • 2021-02-12
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      相关资源
      最近更新 更多