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

基于DataFrame条件的Python数据清理与目标记录生成需求

我来帮你实现这个需求,咱们一步步拆解任务:首先要完成DataFrame的时间段清理,然后提取各列连续空值的区间生成指定格式的记录。下面是基于pandas的完整Python解决方案:

需求拆解

核心要完成两个任务:

  1. 从原始DataFrame A中移除指定时间段的行
  2. 分析清理后的DataFrame,找出每一列连续空值的时间段,输出要求格式的结果记录
完整代码实现
import pandas as pd
import numpy as np

# ---------------------- 1. 构造原始DataFrame A ----------------------
raw_data_a = [
    ["1/1/2018 0:00", 10, 10, 10, 10],
    ["1/1/2018 0:10", 10, 25, np.nan, np.nan],
    ["1/1/2018 0:20", 10, 25, np.nan, np.nan],
    ["1/1/2018 0:30", np.nan, np.nan, 25, np.nan],
    ["1/1/2018 0:40", np.nan, np.nan, 25, np.nan],
    ["1/1/2018 0:50", 25, 25, 25, 25],
    ["1/1/2018 1:00", 30, 30, 30, 30],
    ["1/1/2018 1:10", 42, 42, 42, 42],
    ["1/1/2018 1:20", np.nan, np.nan, np.nan, np.nan],
    ["1/1/2018 1:30", np.nan, np.nan, np.nan, np.nan],
    ["1/1/2018 1:40", 40, 40, 40, np.nan],
    ["1/1/2018 1:50", 35, 35, np.nan, np.nan],
    ["1/1/2018 2:00", 37, np.nan, np.nan, np.nan],
    ["1/1/2018 2:10", 49, np.nan, np.nan, np.nan],
    ["1/1/2018 2:20", 51, 51, 51, np.nan],
]
df_a = pd.DataFrame(raw_data_a, columns=["Timestamp", "A", "B", "C", "D"])
# 转换时间列为datetime类型,方便后续时间范围筛选
df_a["Timestamp"] = pd.to_datetime(df_a["Timestamp"], format="%m/%d/%Y %H:%M")

# ---------------------- 2. 构造待移除时间段的DataFrame ----------------------
remove_data = [
    ["1/1/2018 1:20", "1/1/2018 1:30", "to be removed"],
    ["1/1/2018 2:00", "1/1/2018 2:20", "to be removed"],
]
df_remove = pd.DataFrame(remove_data, columns=["StartTime", "EndTime", "Comment"])
df_remove["StartTime"] = pd.to_datetime(df_remove["StartTime"], format="%m/%d/%Y %H:%M")
df_remove["EndTime"] = pd.to_datetime(df_remove["EndTime"], format="%m/%d/%Y %H:%M")

# ---------------------- 3. 清理DataFrame A:移除指定时间段的行 ----------------------
# 标记需要保留的行
df_a["keep_row"] = True
for _, row in df_remove.iterrows():
    # 匹配当前时间段内的所有行
    time_mask = (df_a["Timestamp"] >= row["StartTime"]) & (df_a["Timestamp"] <= row["EndTime"])
    df_a.loc[time_mask, "keep_row"] = False

# 过滤得到清理后的DataFrame
cleaned_df = df_a[df_a["keep_row"]].drop(columns=["keep_row"]).reset_index(drop=True)
print("清理后的DataFrame A:\n", cleaned_df)

# ---------------------- 4. 生成最终结果记录:提取各列连续空值时间段 ----------------------
result_list = []

# 遍历每一列(A、B、C、D)
for col in ["A", "B", "C", "D"]:
    temp_df = cleaned_df[["Timestamp", col]].copy()
    # 标记当前单元格是否为空值
    temp_df["is_null"] = temp_df[col].isna()
    # 给连续的空值块分配分组ID
    temp_df["group_id"] = (temp_df["is_null"] != temp_df["is_null"].shift()).cumsum()
    # 筛选出所有空值分组
    null_groups = temp_df[temp_df["is_null"]].groupby("group_id")
    
    # 提取每个空值分组的起始/结束时间
    for _, group in null_groups:
        start_time = group["Timestamp"].min().strftime("%m/%d/%Y %H:%M")
        end_time = group["Timestamp"].max().strftime("%m/%d/%Y %H:%M")
        result_list.append({
            "StartTime": start_time,
            "EndTime": end_time,
            "Column": col,
            "Comment": "NULL"
        })

# 转换为结果DataFrame
result_df = pd.DataFrame(result_list)
print("\n最终结果记录:\n", result_df)
代码关键步骤解释
  1. 数据预处理:把Timestamp转为datetime类型,这是时间范围筛选和连续分组的基础;用np.nan统一表示原数据中的空白值。
  2. 数据清理:遍历待移除的时间段,标记对应行后过滤掉不需要的记录。
  3. 连续空值提取:
    • 先标记每行是否为空值
    • 用cumsum()生成连续空值的分组ID,实现对连续空值块的划分
    • 对每个空值分组,取最小时间(起始)和最大时间(结束),构造结果行

运行代码后,你会得到和需求完全一致的清理后DataFrame,以及指定格式的结果记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:31:29