Pandas加载含重复列的XLSX文件时类型字典(type_dict)被修改的原因咨询
问题解析:Pandas读取重复列Excel时修改type_dict的原因及解决办法
这是个挺容易踩坑的Pandas细节问题,我来帮你理清楚来龙去脉:
为什么你的type_dict被修改了?
- 重复列名的自动重命名机制:当Excel里存在重复列名(比如你的两个
a列),Pandas在读取时会自动给后续重复的列添加后缀(比如.1、.2),最终DataFrame的列名会变成['a', 'a.1', 'b', 'c']——这是Pandas为了避免列名冲突的默认处理逻辑。 - 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




