为了账号安全,请及时绑定邮箱和手机立即绑定

替换行中的最后一个非 NaN 值

替换行中的最后一个非 NaN 值

茅侃侃 2023-03-08 14:26:25
我想用 NaN 值替换数据框中行中所有最后的非 NaN。我的数据框中有 300 行和 1068 列。并且每一行都有不同数量的有效值,并用 NaN 填充。这是一行的示例:dataframe 中的一行 = [1 2 3 NaN NaN NaN] output =[1 2 NaN NaN NaN NaN]如何替换 CSV 文件中行中的最后一个非 NaN 值?
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

这是一个基于 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 的位置。因为我们想要最后一个有效值,所以我们应该从最后开始。所以 slice 得到列颠倒的数组,并使用np.isnan:


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

array([[ True,  True,  True, False, False, False],

       [False,  True,  True, False, False, False]])

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


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)


查看完整回答
反对 回复 2023-03-08
?
开满天机

TA贡献1786条经验 获得超12个赞

枚举列并检查循环中的值是否为 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。将尝试修复它,否则删除答案..


查看完整回答
反对 回复 2023-03-08
  • 2 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信