Python 删除数据帧中任何其他列的子集列

Python 删除数据帧中任何其他列的子集列,python,pandas,Python,Pandas,我有一个熊猫数据框,如下所示。如何删除任何列(它是剩余列的子集)?我想不使用fillna来做这个 df = pd.DataFrame([ [1,1,3,3], [np.NaN,2,np.NaN,4]], columns=['A','B','C','D'] ) df A B C D 0 1.0 1 3.0 3 1 NaN 2 NaN 4 我可以在这里确定A列是B的子集,C列是D的子集,如下所示: if all(df[A][df[A].notnull()].i

我有一个熊猫数据框,如下所示。如何删除任何列(它是剩余列的子集)?我想不使用fillna来做这个

df = pd.DataFrame([ [1,1,3,3], [np.NaN,2,np.NaN,4]], columns=['A','B','C','D'] )

df
     A  B    C  D
0  1.0  1  3.0  3
1  NaN  2  NaN  4
我可以在这里确定A列是B的子集,C列是D的子集,如下所示:

if all(df[A][df[A].notnull()].isin(df[B]))
我可以在所有列上运行一个循环,然后删除子集列。但是有没有更有效的方法来实现这一点,因此我得出以下结果:

df
   B  D
0  1  3
1  2  4

谢谢。

它仍然需要迭代,但您可以使用此列表理解(使用类似于您提供的if语句)来获取要保留的列:

keep_cols = [x for x in df if not any(df.drop(x, axis=1).apply(lambda y: df[x].dropna().isin(y).all()))]
# ['B', 'D']
然后将结果与
过滤器一起使用

df.filter(items=keep_cols)
#    B  D
# 0  1  3
# 1  2  4
这应该足够快,因为它的核心仍然使用
apply
,而且似乎比在循环中删除列更安全/更有效

如果您喜欢单线解决方案,那么将列表分配给变量当然是可选步骤:

df.filter(items=[x for x in df if not any(df.drop(x, axis=1).apply(lambda y: df[x].dropna().isin(y).all()))])

Hi@BradSolomon,所谓子集,我的意思是,如果列X的“所有”值出现在任何其他列中(无论其左侧或右侧),则删除X。对不起,我意识到OP的标题令人困惑,我将背诵它。不确定此解决方案的根本原因是什么,但由于上述实施,我遇到了这个问题: