重新排列重复的列并在其中包含 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
我有以下数据框:
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