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

如何基于映射字典批量重命名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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:05:53