如何确保Pandas DataFrame包含全部美国州数据?
解决Pandas合并州数据缺失的问题
你的问题出在默认的merge是内连接,只会保留两个DataFrame共有的STATE行,所以最终只有43个州;同时因为两个表都有Count列,合并后自动生成后缀区分的列。下面是两种可行的解决方案:
方法一:左连接+填充缺失值
以全量州的DataFrame为基准,用左连接保留所有50个州,再将原始数据的Count值填充进去,缺失的用0代替:
import pandas as pd # 读取原始CSV数据 states = pd.read_csv("states.csv") # 创建包含全部50个州的DataFrame,Count默认设为0 all_states = pd.DataFrame([ ["AL", 0], ["AK", 0], ["AZ", 0], ["AR", 0], ["CA", 0], ["CO", 0], ["CT", 0], ["DE", 0], ["FL", 0], ["GA", 0], ["HI", 0], ["ID", 0], ["IL", 0], ["IN", 0], ["IA", 0], ["KS", 0], ["KY", 0], ["LA", 0], ["ME", 0], ["MD", 0], ["MA", 0], ["MI", 0], ["MN", 0], ["MS", 0], ["MO", 0], ["MT", 0], ["NE", 0], ["NV", 0], ["NH", 0], ["NJ", 0], ["NM", 0], ["NY", 0], ["NC", 0], ["ND", 0], ["OH", 0], ["OK", 0], ["OR", 0], ["PA", 0], ["RI", 0], ["SC", 0], ["SD", 0], ["TN", 0], ["TX", 0], ["UT", 0], ["VT", 0], ["VA", 0], ["WA", 0], ["WV", 0], ["WI", 0], ["WY", 0] ], columns=["STATE", "Count"]) # 左连接:以all_states为基准,保留所有州 new_df = all_states.merge(states, on="STATE", how="left", suffixes=("_default", "_original")) # 合并Count列:原始数据有值则用原始值,否则用默认的0 new_df["Count"] = new_df["Count_original"].fillna(new_df["Count_default"]) # 保留需要的列 new_df = new_df[["STATE", "Count"]]
方法二:用combine_first快速合并
通过设置STATE为索引,使用combine_first直接用原始数据的非空值覆盖全量州的默认值,代码更简洁:
import pandas as pd # 读取原始数据并设置STATE为索引 states = pd.read_csv("states.csv").set_index("STATE") # 创建全量州DataFrame并设置STATE为索引 all_states = pd.DataFrame([ ["AL", 0], ["AK", 0], ["AZ", 0], ["AR", 0], ["CA", 0], ["CO", 0], ["CT", 0], ["DE", 0], ["FL", 0], ["GA", 0], ["HI", 0], ["ID", 0], ["IL", 0], ["IN", 0], ["IA", 0], ["KS", 0], ["KY", 0], ["LA", 0], ["ME", 0], ["MD", 0], ["MA", 0], ["MI", 0], ["MN", 0], ["MS", 0], ["MO", 0], ["MT", 0], ["NE", 0], ["NV", 0], ["NH", 0], ["NJ", 0], ["NM", 0], ["NY", 0], ["NC", 0], ["ND", 0], ["OH", 0], ["OK", 0], ["OR", 0], ["PA", 0], ["RI", 0], ["SC", 0], ["SD", 0], ["TN", 0], ["TX", 0], ["UT", 0], ["VT", 0], ["VA", 0], ["WA", 0], ["WV", 0], ["WI", 0], ["WY", 0] ], columns=["STATE", "Count"]).set_index("STATE") # 用原始数据的非空值覆盖全量州的默认值,再重置索引 new_df = all_states.combine_first(states).reset_index()
原代码问题说明
- 默认
merge(how="inner"):只保留两个表共有的STATE,所以仅43个州 - 重复列名处理:两个表都有Count列,Pandas自动添加
_x和_y后缀区分,导致列冗余
内容的提问来源于stack exchange,提问作者Joey Stout
相关产品推荐
相关产品推荐

