2 回答

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)

TA貢獻1786條經驗 獲得超13個贊
枚舉列并檢查循環中的值是否為 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。將嘗試修復它,否則刪除答案..
添加回答
舉報