基于特殊重复模式填充Pandas DataFrame中的空值
Pandas 数据清洗:填充City_ID与Address_type空值
需求概述
给定包含空值的Pandas DataFrame,需按照特定规则填充City_ID和Address_type字段,同时可同步修正City等字段(无需严格精确)。
原始数据
| City_ID | Date | State | City | Address_type |
|---|---|---|---|---|
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| NaN | 10/1/24 | 加利福尼亚州 | 1002 | NaN |
| NaN | 10/1/24 | 加利福尼亚州 | House | NaN |
| NaN | NaN | NaN | NaN | NaN |
| NaN | 10/1/24 | 加利福尼亚州 | 圣迭戈 | NaN |
| NaN | 10/1/24 | 加利福尼亚州 | 圣迭戈 | NaN |
| NaN | 10/1/24 | 纽约州 | 1003 | NaN |
| NaN | 10/1/24 | 纽约州 | Apartment | NaN |
| NaN | NaN | NaN | NaN | NaN |
| NaN | 10/1/24 | 纽约州 | 皇后区 | NaN |
| NaN | 10/1/24 | 纽约州 | 皇后区 | NaN |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
期望输出
| City_ID | Date | State | City | Address_type |
|---|---|---|---|---|
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| 1001 | 10/1/24 | 德克萨斯州 | 休斯顿 | House |
| 1002 | 10/1/24 | 加利福尼亚州 | 圣迭戈 | House |
| 1002 | 10/1/24 | 加利福尼亚州 | 圣迭戈 | House |
| 1002 | 10/1/24 | 加利福尼亚州 | 圣迭戈 | House |
| 1002 | 10/1/24 | 加利福尼亚州 | 圣迭戈 | House |
| 1002 | 10/1/24 | 加利福尼亚州 | 圣迭戈 | House |
| 1003 | 10/1/24 | 纽约州 | 皇后区 | Apartment |
| 1003 | 10/1/24 | 纽约州 | 皇后区 | Apartment |
| 1003 | 10/1/24 | 纽约州 | 皇后区 | Apartment |
| 1003 | 10/1/24 | 纽约州 | 皇后区 | Apartment |
| 1003 | 10/1/24 | 纽约州 | 皇后区 | Apartment |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
| 1004 | 10/1/24 | 华盛顿特区 | 华盛顿特区 | Apartment |
填充规则
- 存在空值的城市组固定为5条连续记录,其中第3条
City为空 - 组内第1条
City值为正确的City_ID - 组内第2条
City值为正确的Address_type - 组内第4-5条
City值为正确的城市名称 - 无空值的组保持原样,填充操作仅作用于问题组
解决方案代码
import pandas as pd import numpy as np # 加载原始数据(替换为你的数据源) data = { 'City_ID': [1001, 1001, 1001, 1001, 1001, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1004, 1004, 1004, 1004, 1004], 'Date': ['10/1/24', '10/1/24', '10/1/24', '10/1/24', '10/1/24', '10/1/24', '10/1/24', np.nan, '10/1/24', '10/1/24', '10/1/24', '10/1/24', np.nan, '10/1/24', '10/1/24', '10/1/24', '10/1/24', '10/1/24', '10/1/24', '10/1/24'], 'State': ['德克萨斯州', '德克萨斯州', '德克萨斯州', '德克萨斯州', '德克萨斯州', '加利福尼亚州', '加利福尼亚州', np.nan, '加利福尼亚州', '加利福尼亚州', '纽约州', '纽约州', np.nan, '纽约州', '纽约州', '华盛顿特区', '华盛顿特区', '华盛顿特区', '华盛顿特区', '华盛顿特区'], 'City': ['休斯顿', '休斯顿', '休斯顿', '休斯顿', '休斯顿', '1002', 'House', np.nan, '圣迭戈', '圣迭戈', '1003', 'Apartment', np.nan, '皇后区', '皇后区', '华盛顿特区', '华盛顿特区', '华盛顿特区', '华盛顿特区', '华盛顿特区'], 'Address_type': ['House', 'House', 'House', 'House', 'House', np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 'Apartment', 'Apartment', 'Apartment', 'Apartment', 'Apartment'] } df = pd.DataFrame(data) # 识别所有问题组的起始索引 problem_group_starts = [] total_rows = len(df) # 遍历查找符合规则的问题组(第3条City为空的5连记录) for idx in range(2, total_rows - 2): if pd.isna(df['City'].iloc[idx]): group_start = idx - 2 group_end = idx + 2 # 确保组范围有效 if group_end < total_rows: problem_group_starts.append(group_start) # 去重避免重复处理 problem_group_starts = list(set(problem_group_starts)) # 批量处理每个问题组 for start in problem_group_starts: end = start + 4 # 提取组内关键数据 target_city_id = df['City'].iloc[start] target_address_type = df['City'].iloc[start + 1] target_city_name = df['City'].iloc[start + 3] # 填充核心字段 df.loc[start:end, 'City_ID'] = target_city_id df.loc[start:end, 'Address_type'] = target_address_type df.loc[start:end, 'City'] = target_city_name # 可选:同步填充Date和State为组内非空值(提升数据一致性) df.loc[start:end, 'Date'] = df['Date'].iloc[start] df.loc[start:end, 'State'] = df['State'].iloc[start] # 输出处理后的结果 print(df.to_markdown(index=False))
代码说明
- 组识别:通过遍历找到所有第3条
City为空的位置,以此定位问题组的起始索引(向前推2行) - 数据提取:从组内指定位置提取
City_ID、Address_type和城市名称 - 批量填充:对整个问题组的对应字段进行批量赋值,确保只修改目标组,不影响其他正常数据
- 可选优化:同步填充
Date和State字段,保证组内数据一致性(符合需求中“无需严格准确”的要求)
内容的提问来源于stack exchange,提问作者databaseBoss
相关产品推荐
相关产品推荐

