嵌套循环结合字典、列表处理Pandas列添加else后列表长度异常问询
问题原因
你的代码长度暴涨的核心原因是else分支的绑定逻辑错误,且没有提前终止循环:
- 当前
else和最内层的if el == row绑定,意味着每遍历到字典里的一个州缩写,只要和当前行值不匹配,就会往列表里追加一次Unknown - 你的
region_dict里总共有33个州/州组合条目,每一行数据都会触发33次判断:匹配成功的场景下会追加1次区域名+32次Unknown,匹配失败的场景下会追加33次Unknown,最终列表长度等于原DataFrame行数*33,和你观测到的暴涨结果一致 - 原本没有
else分支时,只有匹配成功才会追加内容,刚好每个行仅匹配成功1次,所以长度等于原DataFrame行数463
修复方案
方案1:调整循环逻辑,每行仅追加1次结果
region_list = [] for row in user_df['State']: matched = False for k, v in region_dict.items(): if row in v: region_list.append(k) matched = True break # 匹配到就跳出循环,无需继续遍历其他区域 if not matched: region_list.append('Unknown')
方案2:更高效的Pandas原生写法,避免嵌套循环
先把区域字典转换为「州缩写-区域」的直接映射表,再用map批量处理:
# 构建州到区域的映射字典 state_region_map = {} for region, states in region_dict.items(): for state in states: state_region_map[state] = region # 直接生成区域列,未匹配的自动填充Unknown user_df['region'] = user_df['State'].map(state_region_map).fillna('Unknown') # 如需转列表调用 user_df['region'].tolist() 即可
内容的提问来源于stack exchange,提问作者Digital Moniker
相关产品推荐
相关产品推荐

