Python 删除数据帧中任何其他列的子集列
我有一个熊猫数据框,如下所示。如何删除任何列(它是剩余列的子集)?我想不使用fillna来做这个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
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的标题令人困惑,我将背诵它。不确定此解决方案的根本原因是什么,但由于上述实施,我遇到了这个问题: