如何使用Python或R将DataFrame整理为所需格式?
可直接复用的清洗方案
核心逻辑无需手动逐行处理:先识别ID列中混入的日期行,将日期行携带的有效NF值向下填充到其管辖的所有ID行,最后过滤掉所有日期行即可得到目标结构。
Python 实现(基于pandas)
- 未安装依赖先执行安装命令:
pip install pandas openpyxl
- 替换代码中的文件路径后直接运行即可:
import pandas as pd import re # 日期格式匹配规则,若导出的日期格式和常规年月日格式不一致,修改此处正则即可 def match_date(input_str): return bool(re.match(r"^\d{4}[-/]\d{1,2}[-/]\d{1,2}$", str(input_str).strip())) # 读取原始数据,csv格式可替换为pd.read_csv() raw_df = pd.read_excel("你的原始数据文件路径.xlsx") # 将非日期行的NF值置空,为向下填充做准备 raw_df.loc[~raw_df["ID"].apply(match_date), "NF"] = None # 向下填充NF值:每个日期行的NF会自动填充到下方所有ID行,直到碰到下一个日期行 raw_df["NF"] = raw_df["NF"].ffill() # 过滤掉所有日期行,得到最终清洗结果 clean_df = raw_df[~raw_df["ID"].apply(match_date)].reset_index(drop=True) # 导出结果,csv格式可替换为to_csv() clean_df.to_excel("清洗完成的结果.xlsx", index=False)
R 实现(基于tidyverse)
- 未安装依赖先执行安装命令:
install.packages(c("tidyverse", "readxl", "writexl"))
- 替换代码中的文件路径后直接运行即可:
library(tidyverse) library(readxl) library(writexl) # 日期格式匹配规则,和Python版本逻辑一致 match_date <- function(s) { str_detect(str_trim(as.character(s)), "^\\d{4}[-/]\\d{1,2}[-/]\\d{1,2}$") } clean_df <- read_excel("你的原始数据文件路径.xlsx") %>% # 非日期行NF置空 mutate(NF = ifelse(!match_date(ID), NA_character_, NF)) %>% # 向下填充NF值 fill(NF, .direction = "down") %>% # 过滤日期行 filter(!match_date(ID)) # 导出结果 write_xlsx(clean_df, "清洗完成的结果.xlsx")
适配调整提示
- 若导出的日期是
日/月/年、月-日-年等其他格式,仅需修改match_date函数里的正则匹配规则即可 - 若数据开头存在没有前置日期的ID行,清洗后对应NF列为空,可根据业务规则单独处理这类边缘情况
- 处理前建议备份原始文件,避免误操作丢失数据
内容的提问来源于stack exchange,提问作者sohrenan
相关产品推荐
相关产品推荐

