You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Pandas加载含重复列的XLSX文件时类型字典(type_dict)被修改的原因咨询

问题解析:Pandas读取重复列Excel时修改type_dict的原因及解决办法

这是个挺容易踩坑的Pandas细节问题,我来帮你理清楚来龙去脉:

为什么你的type_dict被修改了?

  1. 重复列名的自动重命名机制:当Excel里存在重复列名(比如你的两个a列),Pandas在读取时会自动给后续重复的列添加后缀(比如.1.2),最终DataFrame的列名会变成['a', 'a.1', 'b', 'c']——这是Pandas为了避免列名冲突的默认处理逻辑。
  2. dtype参数的可变对象特性:你传入的type_dict是一个可变字典,而pd.read_excel内部会直接对这个传入的字典进行修改:它会把自动生成的新列名(比如a.1)添加到字典里,并且复用原列名对应的类型(这里就是str)。这就是为什么你打印type_dict.keys()会看到多出来a.1

你可以再验证一下:打印type_dict.values(),会发现'a.1'对应的类型确实是str,和原a列的类型一致。

如何避免原字典被修改?

有几种简单的解决方案,按需选择:

1. 传入字典的副本

在调用read_excel时,传入type_dict的副本,这样Pandas修改的只是副本,原字典不会受到影响:

import pandas as pd
import pathlib
type_dict = {'a': str, 'b': str, 'c': str, }
if __name__ == "__main__":
    # 用.copy()创建字典副本传入
    df = pd.read_excel(pathlib.PurePath('./test.xlsx'), dtype=type_dict.copy())
    print(list(type_dict.keys()))  # 输出依然是['a', 'b', 'c']

2. 直接传入匿名字典

如果不需要复用type_dict变量,直接把字典写在dtype参数里,即使被修改也不会影响其他逻辑:

df = pd.read_excel(pathlib.PurePath('./test.xlsx'), dtype={'a': str, 'b': str, 'c': str})

3. 先读取再手动处理列名和类型

先不指定dtype读取数据,手动给重复列重命名后,再统一设置类型,这种方式更灵活:

df = pd.read_excel(pathlib.PurePath('./test.xlsx'))
# 手动给重复列改名,比如把第二个a改成a_dup
df.columns = ['a', 'a_dup', 'b', 'c']
# 统一设置各列类型
df = df.astype({'a': str, 'a_dup': str, 'b': str, 'c': str})

内容的提问来源于stack exchange,提问作者cdol

火山引擎 最新活动