You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:15:39