合并存储DataFrame的两个字典时循环合并结果与手动不一致如何解决
代码问题核心原因
- 最根本的问题是
dict.keys()的遍历顺序不可靠:Python 3.7之前的版本,字典的键不保留插入顺序,遍历keys()返回的顺序是随机的,你预期的「按插入位置配对」实际是乱序配对,自然和手动逐对合并的结果不一致。即使是Python 3.7+版本支持字典保留插入顺序,只要两个字典的键插入顺序不同,也会出现配对错误。 - 次要风险:如果两个字典的键数量不一致,
zip()会自动以更短的字典长度为准截断,剩余的键直接被丢弃且不会抛出报错,容易遗漏数据。
修正方案
方案1:确需按插入位置配对的写法
显式将键转为列表固定顺序,同时增加长度校验避免截断问题:
Total_data_dict = {} # 显式固化键的遍历顺序 keys_1 = list(dict_1.keys()) keys_2 = list(dict_2.keys()) # 提前校验长度匹配 if len(keys_1) != len(keys_2): raise ValueError("两个字典键的数量不匹配,无法按位置配对") for k1, k2 in zip(keys_1, keys_2): Total_data_dict[f"Total_{k1}"] = pd.merge(dict_1[k1], dict_2[k2], on=['Name'], how='inner')
方案2:按相同键名配对(多数场景的实际需求)
如果两个字典同键名的DataFrame才需要合并,直接取公共键遍历即可,完全规避顺序问题:
Total_data_dict = {} # 取两个字典的公共键遍历 common_keys = dict_1.keys() & dict_2.keys() for k in common_keys: Total_data_dict[f"Total_{k}"] = pd.merge(dict_1[k], dict_2[k], on=['Name'], how='inner')
内容的提问来源于stack exchange,提问作者the phoenix
相关产品推荐
相关产品推荐

