重新排列重复且包含nan的列的干净方式



我有以下数据框架:

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个非nan。也就是说,输出看起来像这样:

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循环遍历row并将所有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

最新更新