我有一个下面的数据框架,我试图以最有效的方式获得具有空字符串的列名。执行df.head()后的数据框如下所示:
id type check company test
123 A Soft [[1649106820, 100029907158392,,,, 123]]
456 B Hard GMC [[1649106812, 100029907158312,,,, 456]]
我正在尝试不使用循环或以一种有效的方式来做谢谢你的帮助
预期输出{公司,测试}
使用apply()
对所有行执行测试,然后使用.any()
测试是否对任何行都成立。
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()]
下面是一种无需测试单个值类型即可查找包含空字符串的列的方法:
empty_cols = {col for col in df.columns if df[col].explode().explode().astype(str).str.strip().eq('').any()}
输出:
{'company', 'test'}
解释:
- 使用
explode()
两次以确保我们已经解压缩了列表类型的值,例如问题 中的 - 使用
astype(str)
将数值类型转换为字符串,例如id
列中的那些 - 使用
str.strip().eq('')
获取给定列的布尔序列,指示值(可能未打包)是否为空字符串(在去掉空格后) - 使用
Series.any()
将布尔系列减少为布尔值,指示列是否有空字符串 - 使用集合推导式来获得包含所有包含空字符串的列的标签的集合(包括在解包list-of-list值之后)。
test
列中的值