删除DataFrame中Unnamed列时报错,寻求有效解决方案
问题:删除DataFrame中的Unnamed列
我需要删除DataFrame df 中的Unnamed列,数据读取代码如下:
df1 = pd.read_excel('./earnings-residence-borough.xlsx', sheet_name='Total, weekly', skiprows=[1, 2], header=0) df1.head(5)
执行print(df.columns)后输出:
Index([ 'Code', 'Area', 2002, 'Unnamed: 3', 2003, 'Unnamed: 5', 2004, 'Unnamed: 7', 2005, 'Unnamed: 9', 2006], dtype='object')
尝试过的方案及报错
方案1:
df.loc[:, ~df.columns.str.contains('^Unnamed')]报错:
TypeError: bad operand type for unary ~: 'Index'方案2:
remove_cols = [col for col in df.columns if 'Unnamed' in col] df.drop(remove_cols, axis='columns', inplace=True)报错:
TypeError: argument of type 'int' is not iterable方案3:
df.drop(df.columns[df.columns.str.contains('Unnamed',case = False)],axis = 1, inplace = True)报错:
ValueError: Cannot mask with non-boolean array containing NA / NaN values执行
df.columns.str.contains('^Unnamed')输出:Index([False, False, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True, nan, True], dtype='object')
解决方法
核心问题是列名混合了字符串和整数类型(如2002是int,'Unnamed: 3'是str),导致字符串方法处理时产生NaN,遍历判断时触发类型错误。以下是三种可行方案:
方法1:统一列名为字符串后筛选
先将所有列名转为字符串,再筛选掉包含Unnamed的列:
# 统一列名为字符串类型 df.columns = df.columns.astype(str) # 保留非Unnamed列 df = df.loc[:, ~df.columns.str.contains('^Unnamed')]
方法2:遍历列名时判断类型
遍历列名时,仅对字符串类型的列名检查是否包含Unnamed:
remove_cols = [] for col in df.columns: if isinstance(col, str) and 'Unnamed' in col: remove_cols.append(col) df.drop(remove_cols, axis=1, inplace=True)
方法3:读取阶段直接过滤(推荐)
在读取Excel时就通过usecols参数跳过Unnamed列,避免后续处理:
df1 = pd.read_excel( './earnings-residence-borough.xlsx', sheet_name='Total, weekly', skiprows=[1, 2], header=0, usecols=lambda x: not (isinstance(x, str) and 'Unnamed' in x) )
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

