pandas无法删除CSV导入DataFrame中的Unnamed未命名列
问题根源
pandas 绝大多数 DataFrame 操作默认不会修改原对象,而是返回修改后的新 DataFrame。你代码中筛选列、调用drop的操作都没有接收返回值,相当于计算完结果就直接丢弃,原month_csv变量存储的内容没有任何改动,所以打印时还是能看到Unnamed列。
具体无效的代码点:
month_csv.columns.str.match("Unnamed"):仅生成判断列名是否匹配规则的布尔序列,没有对DataFrame做任何修改,也没有存储结果month_csv.loc[:,~month_csv.columns.str.match("Unnamed")]:确实完成了非Unnamed列的筛选,但没有把筛选结果重新赋值给变量,操作结果直接被丢弃month_csv.drop("Unnamed: 0", axis=1):drop方法默认inplace=False,返回删除指定列后的新DataFrame,同样因为没有赋值,原数据未发生任何变化
修复方法
方案1(推荐):读取CSV时从源头过滤Unnamed列
大部分Unnamed列都是之前存储CSV时未设置index=False,把行索引存成了无名列。直接在读取拼接阶段就过滤掉这类列,不需要后续额外处理:
for m in mlist: # 遍历每个月份 print(f'Running merge for {m} collecting csv files...') csvlist = [i for i in glob.glob(f'{m}2019_G*.csv')] # 读取每个CSV时直接过滤所有Unnamed开头的列再拼接 month_csv = pd.concat([ pd.read_csv(csv).loc[:, lambda df: ~df.columns.str.startswith('Unnamed')] for csv in csvlist ]) month_csv = month_csv.astype({unique_gridid:'int'}) month_csv = month_csv.set_index(unique_gridid) print(month_csv)
方案2:修正原有删列逻辑,补全赋值操作
如果要保留你原来的处理顺序,只需要把列筛选/删除后的结果重新赋值给month_csv即可,推荐用列名匹配的方式,可以一次性删掉所有Unnamed开头的列,比硬编码删除Unnamed: 0兼容性更好:
# 原有拼接、类型转换、设索引逻辑不变 month_csv = pd.concat([pd.read_csv(csv) for csv in csvlist]) month_csv = month_csv.astype({unique_gridid:'int'}) month_csv = month_csv.set_index(unique_gridid) # 筛选后赋值回变量,替换原有无效的两行操作 month_csv = month_csv.loc[:, ~month_csv.columns.str.match("Unnamed")] # 如果坚持用drop方法,也要记得赋值,加errors='ignore'可以避免列不存在时报错 # month_csv = month_csv.drop("Unnamed: 0", axis=1, errors='ignore') print(month_csv)
小提示:不推荐使用
inplace=True参数修改原对象,这个参数在pandas新版本中已经逐步不推荐使用,赋值的写法可读性和可维护性更好。
内容的提问来源于stack exchange,提问作者MrKingsley
相关产品推荐
相关产品推荐

