如何在使用glob批量追加列的for循环中修改多列表头?
问题根源与解决方案
你遇到的核心问题是**pandas.DataFrame.rename()默认不会修改原DataFrame**——它会返回一个修改后的新DataFrame对象,但你在循环里既没有把这个返回值重新赋值给df,也没有使用inplace=True参数来直接修改原对象,所以原DataFrame的列名根本没发生变化,导致后续追加的列还是原来的名字。
两种直接修复方式
方式1:使用inplace=True参数直接修改原DataFrame
在rename时加上这个参数,让修改直接作用于当前的df:
df.rename(columns={"cases7_lk": "cases7_lk_" + base}, inplace=True)
方式2:将修改后的新DataFrame重新赋值给df
如果你不想修改原对象(比如后续还要用原列名),可以把返回的新对象存回df:
df = df.rename(columns={"cases7_lk": "cases7_lk_" + base})
更高效的优化方案
其实你只需要提取cases7_lk这一列,没必要修改整个DataFrame的列名。可以直接对Series进行重命名,代码更简洁高效:
import os import glob import pandas as pd path = r'C:\Users\....\Daten' all_files = glob.glob(path + "/*.csv") li = [] # 从第一个文件提取RS列作为索引(避免硬编码特定文件) first_df = pd.read_csv(all_files[0]) li.append(first_df["RS"]) for filename in all_files: df = pd.read_csv(filename) # 提取文件名中的日期部分 file_base = os.path.splitext(os.path.basename(filename))[0].split('_')[3] # 直接重命名Series后加入列表 renamed_series = df["cases7_lk"].rename(f"cases7_lk_{file_base}") li.append(renamed_series) # 合并所有列并设置索引 incidences_complete = pd.concat(li, axis=1).set_index("RS") display(incidences_complete)
补充说明
你提到循环外rename能正常工作,大概率是因为你在循环外无意间做了赋值操作(比如df = df.rename(...)),而循环里漏掉了这一步,导致修改没有生效。
内容的提问来源于stack exchange,提问作者xauximan
相关产品推荐
相关产品推荐

