【问题标题】:Check if 2 columns in dataframe are null, if so then delete those columns检查数据框中的 2 列是否为空,如果是,则删除这些列
【发布时间】:2021-08-22 18:15:18
【问题描述】:

Dataframe如下图:

col_a1, col_a2, col_a3, col_b1, col_b2, col_b3,col_c1, col_c2, col_c3 
878       def    ert     123     nan     nan     001     ert    yui
999       erf    qaz     345     nan     nan     765     jkl    dfg

条件:

> if col_a2 and col_a3 is null or empty them drop col_a1,col_a2,col_a3
> if col_b2 and col_b3 is null or empty them drop col_b1,col_b2,col_b3
> if col_c2 and col_c3 is null or empty them drop col_c1,col_c2,col_c3

最终的数据框应该是:

col_a1, col_a2, col_a3,col_c1, col_c2, col_c3 
878       def    ert     001     ert    yui
999       erf    qaz     765     jkl    dfg

【问题讨论】:

  • 请提供示例数据框以及预期结果;那么帮助就更容易了。
  • 已添加:) @Cleb
  • “null 或空”是什么意思?完全 nan 列和“空”列之间有区别吗?
  • @HenryEcker Null 表示单元格是否使用“null”进行硬编码,而单元格为“”时为空
  • 谢谢,但如果它是一个可以复制和粘贴的示例就更好了。尝试建立一个帮助门槛尽可能低的例子:)

标签: python pandas dataframe


【解决方案1】:

我相信你的答案是dropna

编辑:(感谢杰里米·卡尼的评论)

示例: 让我们创建数据框:

df = pd.DataFrame({'col_a1': ['def', 'erf'], 'col_a2': ['ert', 'qaz'], 'col_b2': [None, None]})

 col_a1 col_a2 col_b2
0    def    ert   None
1    erf    qaz   None

现在我们可以通过在轴 1(列)上使用 dropna 来删除 col_b2 并将阈值设置为您需要的任何值(我在此示例中将其设置为 2)

df.dropna(axis =1, thresh = 2)

 col_a1 col_a2
0    def    ert
1    erf    qaz

【讨论】:

  • 这似乎完全删除了 nan 列,但似乎没有解决 OP 中的任何条件逻辑
【解决方案2】:
import pandas as pd
import numpy as np

df = pd.DataFrame({'col_a1': ['def', 'erf'], 'col_a2': ['ert', 'qaz'], 'col_b2': [None, None], 'col_b3': [np.nan, np.nan]})

  col_a1 col_a2 col_b2  col_b3
0    def    ert   None     NaN
1    erf    qaz   None     NaN

现在我们可以使用.isnull():

df.isnull()

   col_a1  col_a2  col_b2  col_b3
0   False   False    True    True
1   False   False    True    True

因此,对于您提到的条件,我们现在可以检查两列中的所有值是否都评估为True

target_cols = ['col_b2', 'col_b3']

df[target_cols].isnull()

   col_b2  col_b3
0    True    True
1    True    True

df[target_cols].isnull().all()

col_b2    True
col_b3    True

df[target_cols].isnull().all().all()
True

所以,我们可以这样做:

if df[target_cols].isnull().all().all():
    df = df.drop(target_cols, axis=1)

屈服

  col_a1 col_a2
0    def    ert
1    erf    qaz

【讨论】:

    【解决方案3】:

    鉴于您的列名似乎遵循逻辑模式,一个小循环可能是最简单的。我举了一个 col_XY 的例子,其中 X: a/b/c 和 Y: 1/2/3 但你可以很容易地适应任何东西。

    总而言之,遍历 X 的组,检查子列是否都是 NA 并删除整个组:

    
    for cols in [['col_%s%s' % (i,j)
                  for j in '123']
                 for i in 'abc']:
        if df[cols[1:]].isna().all().all():
            df = df.dropna(cols, axis=1)
    

    注意。列组如下所示:

    [['col_a1', 'col_a2', 'col_a3'],
     ['col_b1', 'col_b2', 'col_b3'],
     ['col_c1', 'col_c2', 'col_c3']]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 2017-02-20
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      相关资源
      最近更新 更多