You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于特殊重复模式填充Pandas DataFrame中的空值

Pandas 数据清洗:填充City_ID与Address_type空值

需求概述

给定包含空值的Pandas DataFrame,需按照特定规则填充City_ID和Address_type字段,同时可同步修正City等字段(无需严格精确)。

原始数据

City_IDDateStateCityAddress_type
100110/1/24德克萨斯州休斯顿House
100110/1/24德克萨斯州休斯顿House
100110/1/24德克萨斯州休斯顿House
100110/1/24德克萨斯州休斯顿House
100110/1/24德克萨斯州休斯顿House
NaN10/1/24加利福尼亚州1002NaN
NaN10/1/24加利福尼亚州HouseNaN
NaNNaNNaNNaNNaN
NaN10/1/24加利福尼亚州圣迭戈NaN
NaN10/1/24加利福尼亚州圣迭戈NaN
NaN10/1/24纽约州1003NaN
NaN10/1/24纽约州ApartmentNaN
NaNNaNNaNNaNNaN
NaN10/1/24纽约州皇后区NaN
NaN10/1/24纽约州皇后区NaN
100410/1/24华盛顿特区华盛顿特区Apartment
100410/1/24华盛顿特区华盛顿特区Apartment
100410/1/24华盛顿特区华盛顿特区Apartment
100410/1/24华盛顿特区华盛顿特区Apartment
100410/1/24华盛顿特区华盛顿特区Apartment

期望输出

City_IDDateStateCityAddress_type
100110/1/24德克萨斯州休斯顿House
100110/1/24德克萨斯州休斯顿House
100110/1/24德克萨斯州休斯顿House
100110/1/24德克萨斯州休斯顿House
100110/1/24德克萨斯州休斯顿House
100210/1/24加利福尼亚州圣迭戈House
100210/1/24加利福尼亚州圣迭戈House
100210/1/24加利福尼亚州圣迭戈House
100210/1/24加利福尼亚州圣迭戈House
100210/1/24加利福尼亚州圣迭戈House
100310/1/24纽约州皇后区Apartment
100310/1/24纽约州皇后区Apartment
100310/1/24纽约州皇后区Apartment
100310/1/24纽约州皇后区Apartment
100310/1/24纽约州皇后区Apartment
100410/1/24华盛顿特区华盛顿特区Apartment
100410/1/24华盛顿特区华盛顿特区Apartment
100410/1/24华盛顿特区华盛顿特区Apartment
100410/1/24华盛顿特区华盛顿特区Apartment
100410/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))

代码说明

  1. 组识别:通过遍历找到所有第3条City为空的位置,以此定位问题组的起始索引(向前推2行)
  2. 数据提取:从组内指定位置提取City_ID、Address_type和城市名称
  3. 批量填充:对整个问题组的对应字段进行批量赋值,确保只修改目标组,不影响其他正常数据
  4. 可选优化:同步填充Date和State字段,保证组内数据一致性(符合需求中“无需严格准确”的要求)

内容的提问来源于stack exchange,提问作者databaseBoss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:44:50