当所有子列都完全空白时,如何删除 Pandas 多级数据框列

问题描述

数据框:

|--------------------------------------------------------------------|
|    Name        |    email          |  Phone no    |   Gender       |
|----------------|-------------------|--------------|----------------|
|legacy | target |legacy    | target |legacy|target |legacy | target |
|-------|--------|----------|--------|------|-------|-------|--------|
|Name1  |Name1   |n1@abc.com|        |      |       |       |        |
|Name2  |Name2   |          |        |      |   12  |       |        |
|--------------------------------------------------------------------|

预期输出

|---------------------------------------------------|
|    Name        |    email          |  Phone no    |
|----------------|-------------------|--------------|
|legacy | target |legacy    | target |legacy|target |
|-------|--------|----------|--------|------|-------|
|Name1  |Name1   |n1@abc.com|        |      |       |
|Name2  |Name2   |          |        |      |   12  |
|---------------------------------------------------|

我正在使用以下代码,但它也删除了“电子邮件目标”和“电话无遗留”列。

df.dropna(how='all',axis=1,inplace=True)

但是,我只想删除“性别”列,因为这是唯一一个遗留字段和目标字段都完全空白的列。

谁能帮帮我。

谢谢。

解决方法

尝试(我假设空单元格是 NaN):

m=df.isna().all().unstack(level=1)
cols=m[m.all(1)].index.tolist()

最后使用get_level_values()

df=df.loc[:,~df.columns.get_level_values(0).isin(cols)] 

df 的输出:

         Name             Email             Phone no
    Legecy  Target  Legecy      Target  Legecy  Target
0   Name1   Name1   n1@abc.com  NaN     NaN     NaN
1   Name1   Name2   NaN         NaN     NaN     12
,

尝试(我假设空单元格是字符串 ""):

m = (~df.eq("").all().groupby(level=0).all()).eq(True)
x = df.loc[:,m.index[m]]
print(x)

打印:

    Name        Phone no          email       
  legacy target   legacy target  legacy target
0  Name1  Name1                  n1@abc       
1  Name2  Name2              12