基于DataFrame条件的Python数据清理与目标记录生成需求
我来帮你实现这个需求,咱们一步步拆解任务:首先要完成DataFrame的时间段清理,然后提取各列连续空值的区间生成指定格式的记录。下面是基于pandas的完整Python解决方案:
需求拆解
核心要完成两个任务:
- 从原始DataFrame A中移除指定时间段的行
- 分析清理后的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)
代码关键步骤解释
- 数据预处理:把
Timestamp转为datetime类型,这是时间范围筛选和连续分组的基础;用np.nan统一表示原数据中的空白值。 - 数据清理:遍历待移除的时间段,标记对应行后过滤掉不需要的记录。
- 连续空值提取:
- 先标记每行是否为空值
- 用
cumsum()生成连续空值的分组ID,实现对连续空值块的划分 - 对每个空值分组,取最小时间(起始)和最大时间(结束),构造结果行
运行代码后,你会得到和需求完全一致的清理后DataFrame,以及指定格式的结果记录。
内容的提问来源于stack exchange,提问作者NewCoder
相关产品推荐
相关产品推荐

