首先,使用np.isnan 创建一个布尔数组,这会将NaN 标记为True,将非nan 值标记为False,然后对它们进行argsort,这样您将保持非nan 值和NaN 的顺序被推到右边。
idx = np.isnan(df.values).argsort(axis=1)
df = pd.DataFrame(
df.values[np.arange(df.shape[0])[:, None], idx],
index=df.index,
columns=df.columns,
)
h1 h2 h3 h4
Name
A 1.0 2.0 3.0 NaN
B 1.0 3.0 NaN NaN
C 1.0 3.0 2.0 NaN
详情
np.isnan(df.values)
# array([[False, True, False, False],
# [ True, True, False, False],
# [False, False, False, True]])
# False ⟶ 0 True ⟶ 1
# When sorted all True values i.e nan are pushed to the right.
idx = np.isnan(df.values).argsort(axis=1)
# array([[0, 2, 3, 1],
# [2, 3, 0, 1],
# [0, 1, 2, 3]], dtype=int64)
# Now, indexing `df.values` using `idx`
df.values[np.arange(df.shape[0])[:, None], idx]
# array([[ 1., 2., 3., nan],
# [ 1., 3., nan, nan],
# [ 1., 3., 2., nan]])
# Make that as a DataFrame
df = pd.DataFrame(
df.values[np.arange(df.shape[0])[:, None], idx],
index=df.index,
columns=df.columns,
)
# h1 h2 h3 h4
# Name
# A 1.0 2.0 3.0 NaN
# B 1.0 3.0 NaN NaN
# C 1.0 3.0 2.0 NaN