如何在Pandas中基于Township列补全zip列的缺失值?
解决911.csv数据集Zip缺失值(基于Township填充)的方案
核心思路
通过统计每个Township对应的非缺失zip值,用该城镇最具代表性的Zip(比如出现次数最多的众数)填充对应缺失项。
具体实现步骤(Python + Pandas)
- 加载数据并定位缺失项
import pandas as pd # 加载本地的911.csv数据集 df = pd.read_csv('911.csv') # 筛选出Zip缺失的城镇列表 missing_townships = df[df['zip'].isna()]['Township'].unique() print("Zip缺失的城镇:", missing_townships)
- 查看每个缺失城镇的有效Zip分布
这一步能帮你确认每个城镇对应的Zip值,避免错误填充:
# 按城镇分组,统计每个城镇的Zip值出现频率 township_zip_counts = df.dropna(subset=['zip']).groupby('Township')['zip'].value_counts() # 打印缺失城镇的Zip分布 for town in missing_townships: print(f"\n{town} 对应的Zip值及出现次数:") print(township_zip_counts.get(town, "该城镇无有效Zip记录"))
- 填充缺失的Zip值
这里用每个城镇的众数Zip(出现次数最多的)进行填充,也可以根据需求改成其他策略(比如全部Zip的列表):
# 生成城镇到众数Zip的映射字典 township_zip_map = df.dropna(subset=['zip']).groupby('Township')['zip'].agg(lambda x: x.mode()[0]) # 填充缺失值 df['zip'] = df.apply( lambda row: township_zip_map[row['Township']] if pd.isna(row['zip']) else row['zip'], axis=1 ) # 验证填充结果 print("\n填充后Zip列缺失值数量:", df['zip'].isna().sum())
特殊情况处理
如果某个城镇没有任何非缺失的Zip记录,需要手动查找该城镇的官方邮政编码(比如当地邮政局信息),然后手动填充:
# 示例:手动填充某城镇的Zip df.loc[df['Township'] == '目标城镇名称', 'zip'] = 12345 # 替换为实际Zip
内容的提问来源于stack exchange,提问作者Shenin Francis
相关产品推荐
相关产品推荐

