python - 如何删除缺少列名和数据的列
问题描述
因此,我阅读了使用 excel 生成的 CSV 文件。这些可以包含右侧的空列和行 - 分别。低于数据范围/表格。这里的空意味着真的很空。所以:没有列标题,没有任何数据,显然是人工制品。
在我刚刚使用的第一次迭代中
pd.read_csv().dropna(axis=1, how='all', inplace=False).dropna(axis='index', how='all', inplace=False)
这似乎工作正常。但它也会正确删除空列。此处正确为空意味着包含列名的常规列,这些列实际上应该为空,因为那是它们的数据。
我确实想保留所有具有正确列名或包含数据的列-> 有人可能刚刚忘记提供列名,但它是正确的列
所以,根据我第一次使用的https://stackoverflow.com/a/43983654/2215053
unnamed_cols_mask = basedata_df2.columns.str.contains('^Unnamed')
basedata_df2.loc[:, ~unnamed_cols_mask] + basedata_df2.loc[:, unnamed_cols_mask].dropna(axis=1, how='all', inplace=False)
它看起来和感觉都很干净,但它扰乱了列顺序。
所以现在我选择:
df = pd.read_csv().dropna(axis='index', how='all', inplace=False)
df = df[[column_name for column_name in df.columns.array if not column_name.startswith('Unnamed: ') or not df[column_name].isnull().all()]]
哪个有效。但是应该有一个明显正确的方法来完成这个经常发生的任务吗?那么我怎样才能做得更好呢?
具体来说:有没有办法确保以“未命名:”开头的列名是由 csv 创建的,pd.read_csv()
而不是最初从 csv 导入的?
解决方案
不幸的是,我认为没有内置功能。也不在pandas.read_csv
。但是您可以应用以下代码:
# get all rows which contain only nas
ser_all_na= df.isna().all(axis='rows')
# get all rows which got a generic name Unnamed...
del_indexer= ser_all_na.index.str.startswith('Unnamed: ')
# now delete all columns which got no explicit name and only contain nas
del_indexer&= ser_all_na
df.drop(columns=ser_all_na[del_indexer].index, inplace=True)
推荐阅读
- xml - 使用 PyTest 在 XML 中破译字符
- javascript - this.$destroy vs v-if 带有页面的 vue js
- java - Java:循环类
- python - 如何向 keras 对象模型添加展平输入
- java - 如何获取版本列表的最新版本
- nuxt.js - 如何从动态 url 中获取 id?
- apache-kafka - 当我获取 /connectors 路由时,Kafka 连接 REST Api 崩溃
- python - Python备份6个月内最后修改日期的文件
- python - 堆积条形图返回意外输出(Python,绘图)
- docker - 需要 EC2 docker 容器的 mkdir 权限