首页 > 解决方案 > 如何删除缺少列名和数据的列

问题描述

因此,我阅读了使用 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 导入的?

标签: pythonpandasdataframedata-cleaning

解决方案


不幸的是,我认为没有内置功能。也不在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)

推荐阅读