我有以下数据框架:
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