如何编写通用代码,按变量类型差异化填充CSV缺失值?
批量CSV缺失值通用填充方案
核心思路
针对不同数据类型的列分别处理缺失值:
- 数值型(int/float):填充
-1 - 字符型:填充
'm' - 时间型(HH:MM格式):保留缺失值(不填充)
通过类型判断+时间格式校验,适配变量细节有差异的多份CSV文件。
完整代码
import pandas as pd import os from datetime import datetime def is_time_format(s): """判断字符串是否为HH:MM格式的时间""" try: datetime.strptime(str(s), '%H:%M') return True except (ValueError, TypeError): return False def batch_fill_missing_values(input_dir, output_dir): # 创建输出目录(不存在则自动创建) os.makedirs(output_dir, exist_ok=True) # 遍历输入目录下所有CSV文件 for filename in os.listdir(input_dir): if not filename.endswith('.csv'): continue file_path = os.path.join(input_dir, filename) df = pd.read_csv(file_path) # 逐列处理缺失值 for col in df.columns: non_null_vals = df[col].dropna() # 先判断是否为时间型列(采样验证格式) if len(non_null_vals) > 0: sample = non_null_vals.sample(min(10, len(non_null_vals))) if all(is_time_format(val) for val in sample): continue # 时间型列留空,跳过填充 # 数值型列填充-1 if pd.api.types.is_numeric_dtype(df[col]): df[col] = df[col].fillna(-1) # 字符型列填充'm' elif pd.api.types.is_object_dtype(df[col]): df[col] = df[col].fillna('m') # 保存处理后的文件 output_path = os.path.join(output_dir, filename) df.to_csv(output_path, index=False) print(f"处理完成:{output_path}") # 使用示例 if __name__ == "__main__": INPUT_DIR = "./input_csvs" # 替换为你的输入CSV目录 OUTPUT_DIR = "./filled_csvs" # 替换为你的输出目录 batch_fill_missing_values(INPUT_DIR, OUTPUT_DIR)
代码说明
- 时间格式校验:通过
is_time_format函数判断字符串是否符合HH:MM格式,采用采样验证的方式提升大文件处理效率。 - 类型判断:利用pandas的
is_numeric_dtype和is_object_dtype精准识别数值型和字符型列,避免误判。 - 批量处理:自动遍历指定目录下所有CSV文件,处理后保留原文件名保存到输出目录,无需手动逐个处理。
- 兼容性:适配变量细节有差异的CSV文件,无需提前指定列名或类型。
内容的提问来源于stack exchange,提问作者Peter Park
相关产品推荐
相关产品推荐

