如何基于州列表与地区列表为DataFrame创建Region列(避免覆盖)
解决DataFrame中Region列被重复赋值覆盖的问题
你的问题出在每次执行broke["Region"] = ...时,都是对整个列进行重新赋值,后面的语句会完全覆盖前面的结果,最终只有最后一次np.where的匹配结果会保留,其他未匹配的都会变成NaN。
下面提供两种可行的解决方案:
方案一:嵌套np.where(延续你的原有写法)
通过嵌套np.where按顺序判断州所属地区,未匹配当前条件的会进入下一层判断,避免覆盖之前的结果:
import numpy as np import pandas as pd # 你的地区列表定义保持不变 east = ['CT','MA','ME','NH','NJ','NY','PA','RI','VT'] midwest = ['IA','IL','IN','KS','MI','MN','MO','ND','NE','OH','SD','WI'] south = ['AL','AR','DC','DE','FL','GA','KY','LA','MD','MS','NC','OK','SC','TN','TX','VA','WV'] west = ['AK','AZ','CA','CO','HI','ID','MT','NM','NV','OR','UT','WA','WY'] # 嵌套np.where实现多条件赋值 broke["Region"] = np.where(broke["state"].isin(east), "East", np.where(broke["state"].isin(midwest), "Midwest", np.where(broke["state"].isin(south), "South", np.where(broke["state"].isin(west), "West", np.NaN))))
方案二:字典映射(更简洁易维护)
先构造州到地区的映射字典,再用map方法一次性完成赋值,这种方式代码可读性更高,后续修改地区或州列表时更方便:
# 构造州-地区映射字典 state_to_region = {**{s: "East" for s in east}, **{s: "Midwest" for s in midwest}, **{s: "South" for s in south}, **{s: "West" for s in west}} # 用map方法赋值,未匹配的州会自动返回NaN broke["Region"] = broke["state"].map(state_to_region)
补充说明
- 嵌套
np.where适合条件较少的场景,和你原有代码风格一致; - 字典映射更适合需要频繁维护地区列表的场景,逻辑清晰且易于扩展。
内容的提问来源于stack exchange,提问作者John Williams
相关产品推荐
相关产品推荐

