pandas 从python Dataframe 中获取值为白色的列名,而不使用循环

iqih9akk  于 2023-01-07  发布在  Python
关注(0)|答案(2)|浏览(122)

我有一个下面的数据框,我试图用最有效的方法得到空字符串的列名。执行df.head()后,数据框看起来如下。

id   type   check company  test
123   A     Soft             [[1649106820, 100029907158392,,,, 123]]                                
456   B     Hard    GMC      [[1649106812, 100029907158312,,,, 456]]

我正尝试不使用循环或以有效的方式来做它。感谢帮助
预期输出{公司,测试}

mwg9r5ms

mwg9r5ms1#

使用apply()对所有行执行测试,然后使用.any()测试是否对任何行都为true。

def empty_val(val):
    if isinstance(val, list):
        return any(str(item).strip() == "" for item in val)
    else
        return str(item).strip() == ""

empty_cols = [col for col in df if df[col].apply(empty_val).any()]
fgw7neuy

fgw7neuy2#

下面是一种查找包含空字符串的列而不测试单个值类型的方法:

empty_cols = {col for col in df.columns if df[col].explode().explode().astype(str).str.strip().eq('').any()}

输出:

{'company', 'test'}

说明:

  • 使用explode()两次,以确保我们已经解包了类型为list of list的值,例如问题中test列中的值
  • 使用astype(str)将数字类型转换为字符串,如列id中的类型
  • 使用str.strip().eq('')获取给定列的boolean Series,指示值(可能未打包)是否为空字符串(在去除空格后)
  • 使用Series.any()将boolean Series简化为指示列是否有空字符串的布尔值
  • 使用一个集合解析来获得一个集合,该集合包含所有包含空字符串的列的标签(包括在解包列表值之后)。

相关问题