如何基于映射字典批量重命名Pickle格式DataFrame的列名?
统一重命名多份Pickle文件中DataFrame的列名
问题场景
我有多份Pickle格式的Pandas DataFrame,它们存储的核心信息一致,但列命名规则不统一,示例如下:
> file name: Columns_['Weryfikacja UK - 2022-04-14.xlsx_20uk-woocommerce-last-5yrs-expo.pkl'].pkl > columns_nam: Index(['domain', 'phones', 'phones_data_source', 'company_name', 'SourceFile'], dtype='object') > > file name: Columns_['US _ Canada - rechurn - 01.2022-04.2022.xlsx_Other.pkl'].pkl > columns_nam: Index(['Phone', 'Domain', 'SourceFile'], dtype='object') > > file name: Columns_['2022-08 - US _ Canada.xlsx_29.08-02.09 WixStore USCA.pkl'].pkl > columns_nam: Index(['Phone', 'Alternative phone 1', 'Alternative phone2', 'Alternative phone3', 'Alternative phone4', 'SourceFile'], dtype='object')
我已经定义了列名统一映射的字典:
my_dict = { "Domain": ['Domain','domain', 'WWW', 'www'], "Phone": ['Phone','phone_number', 'phones', 'Tel'], "AlternativePhone1": ['Alternative phone1','Alternative phone 2', 'phones2'], "AlternativePhone2": ['Alternative phone2','Alternative phone 3', 'phones3'], "AlternativePhone3": ['Alternative phone3','Alternative phone 4', 'phones4'], "AlternativePhone4": ['Alternative phone4','Alternative phone 5', 'phones5'], "SourceFile": ['SourceFile'] }
目前已有读取Pickle文件的基础循环代码:
for file in glob.glob("*.pkl"): df = pd.read_pickle(file)
需要完善代码,实现按上述字典统一所有DataFrame的列名,最终列名格式如下:
> file name: Columns_['2022-08 - US _ Canada.xlsx_29.08-02.09 WixStore USCA.pkl'].pkl > columns_nam: Index(['Phone', 'AlternativePhone1', 'AlternativePhone2', 'AlternativePhone3', 'AlternativePhone4', 'SourceFile'], dtype='object')
解决方案
1. 转换映射字典格式
原字典的结构是目标列名: 别名列表,我们需要将其转换为别名: 目标列名的格式,这样才能直接用于df.rename()方法:
# 反转字典,生成别名到目标列名的映射 rename_mapping = {} for target_col, aliases in my_dict.items(): for alias in aliases: rename_mapping[alias] = target_col
2. 完善循环代码
在读取每个DataFrame后,使用转换后的映射字典重命名列,同时可以选择处理不在映射中的列(比如保留或删除),最后将修改后的DataFrame重新保存为Pickle文件:
import pandas as pd import glob # 定义原始映射字典 my_dict = { "Domain": ['Domain','domain', 'WWW', 'www'], "Phone": ['Phone','phone_number', 'phones', 'Tel'], "AlternativePhone1": ['Alternative phone1','Alternative phone 2', 'phones2'], "AlternativePhone2": ['Alternative phone2','Alternative phone 3', 'phones3'], "AlternativePhone3": ['Alternative phone3','Alternative phone 4', 'phones4'], "AlternativePhone4": ['Alternative phone4','Alternative phone 5', 'phones5'], "SourceFile": ['SourceFile'] } # 生成重命名映射 rename_mapping = {} for target_col, aliases in my_dict.items(): for alias in aliases: rename_mapping[alias] = target_col # 遍历所有Pickle文件 for file in glob.glob("*.pkl"): # 读取DataFrame df = pd.read_pickle(file) # 重命名列:只处理在映射中的列,未匹配的列默认保留 df = df.rename(columns=rename_mapping) # 可选:删除不在目标列名列表中的列(如果不需要保留无关列) target_columns = list(my_dict.keys()) df = df[[col for col in df.columns if col in target_columns]] # 将修改后的DataFrame重新保存(覆盖原文件或保存为新文件) # 覆盖原文件 df.to_pickle(file) # 或者保存为新文件,比如在文件名后加"_standardized" # df.to_pickle(f"{file.split('.pkl')[0]}_standardized.pkl") print(f"已完成文件 {file} 的列名标准化")
代码说明
rename_mapping:将原字典反转后,每个别名都对应到唯一的目标列名,确保重命名逻辑准确。df.rename(columns=rename_mapping):自动匹配列名,将别名替换为目标列名,未匹配的列保持原样。- 可选的列过滤步骤:如果不需要保留原始DataFrame中不在目标列名列表的列(比如示例中的
phones_data_source、company_name),可以通过列表推导式筛选出目标列。 - 保存方式:可以选择覆盖原文件,或者保存为新文件,避免误操作丢失原始数据。
内容的提问来源于stack exchange,提问作者Bartosz
相关产品推荐
相关产品推荐

