遍历groupby结果.items()时遇ValueError:预期2个值却得1个,求解决
问题解决思路
你的核心问题是误解了groupby后生成对象的结构:当你用groupby(['country', 'primary_volcano_type'])分组后,结果的索引是多级索引(MultiIndex),每个索引项由country和primary_volcano_type两个值组成,对应的值是该组下所有volcano_name_x的列表。因此dirs.items()返回的每个元素结构是((国家, 火山类型), 火山名称列表),而非你预期的其他格式。
正确代码示例
import os import pandas as pd # 假设df_vol_erp是已加载的DataFrame dirs = df_vol_erp.groupby(['country', 'primary_volcano_type'])['volcano_name_x'].apply(list) # 遍历多级索引和对应的火山名称列表 for (pais, tipo), nombres in dirs.items(): # 创建国家目录 path_pais = os.path.join(new_path, str(pais)) os.makedirs(path_pais, exist_ok=True) # 创建火山类型目录 path_tipo = os.path.join(path_pais, str(tipo)) os.makedirs(path_tipo, exist_ok=True) # 创建每个火山名称的子目录 for nombre in nombres: path_nombre = os.path.join(path_tipo, str(nombre)) os.makedirs(path_nombre, exist_ok=True)
错误原因说明
- 最初写法
for pais, tipos, nombres in dirs.items()试图将每个item拆分为三个值,但dirs.items()每个元素仅包含两个部分(索引元组+名称列表),因此触发拆包错误。 - 第二种尝试的写法
for pais, values in dirs.items(): tipos, nombres = values中,values是火山名称的列表,而非包含tipo和nombres的元组,拆包两个值的操作必然失败。
另外,使用os.makedirs的exist_ok=True参数可以省略if not os.path.exists()的判断,直接创建目录(已存在时不会报错),简化代码逻辑。
内容的提问来源于stack exchange,提问作者Javier Soler Medina
相关产品推荐
相关产品推荐

