重新排列重复的列并在其中包含 nan 的简洁方法

Clean way to rearrange columns that are repeated and have nans in them

我有以下数据框:

Subject  Val1  Val1  Int  Val1  Val1  Int2  Val1
A        1     2     3    NaN   NaN   Sp    NaN
B        NaN   NaN   NaN  2     3     NaN   NaN
C        NaN   NaN   4    NaN   NaN   0     3 
D        NaN   NaN   3    NaN   NaN   8     NaN

我只想得到 2 列 val1,因为给定主题最多有 2 个非 nans。即,输出将如下所示:

Subject  Val1  Val1 Int Int2
A        1     2    3   Sp
B        2     3    NaN NaN
C        3     NaN  4   0
D        NaN   NaN  3   8

pandas 中是否有一个函数可以以干净的方式执行此操作?干净意味着只有几行代码。因为一种方法是使用 for 循环遍历行并将所有 nonnan 值带到左侧,但我也想要更清洁和更高效的方法。

想法是按重复的列名称分组,使用 lambda 函数根据缺失值对值进行排序,因此可以在最后的步骤中删除所有只有缺失值的列:

df = df.set_index('Subject')
f = lambda x: pd.DataFrame(x.apply(sorted, key=pd.isna, axis=1).tolist(), index=x.index)
df = df.groupby(level=0, axis=1).apply(f).dropna(axis=1, how='all').droplevel(1, axis=1)
print (df)
         Int Int2  Val1  Val1
Subject                      
A        3.0   Sp   1.0   2.0
B        NaN  NaN   2.0   3.0
C        4.0    0   3.0   NaN
D        3.0    8   NaN   NaN