替换行中最后一个非NaN值



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

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

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

这里有一个基于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)

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

最新更新