如何用脚本批量填充CSV空值?

wen 实用脚本 3

本文目录导读:

如何用脚本批量填充CSV空值?

  1. 使用Python(最通用)
  2. 使用命令行工具(Linux/Mac)
  3. 使用PowerShell(Windows)
  4. 批量处理多个CSV文件
  5. 交互式脚本(带参数)
  6. 建议

我来介绍几种批量填充CSV空值的方法:

使用Python(最通用)

基本用法

import pandas as pd
import numpy as np
# 读取CSV文件
df = pd.read_csv('input.csv')
# 方法1:填充所有空值为特定值
df.fillna('未知', inplace=True)  # 填充为字符串
df.fillna(0, inplace=True)       # 填充为数字
df.fillna('无数据', inplace=True)
# 方法2:按列填充不同值
fill_values = {
    '姓名': '未知姓名',
    '年龄': 0,
    '城市': '未知城市',
    '收入': 0.0
}
df.fillna(value=fill_values, inplace=True)
# 方法3:使用统计值填充
df['年龄'].fillna(df['年龄'].mean(), inplace=True)  # 平均值
df['收入'].fillna(df['收入'].median(), inplace=True) # 中位数
df['城市'].fillna(df['城市'].mode()[0], inplace=True) # 众数(出现最多的值)
# 方法4:向前/向后填充
df.fillna(method='ffill', inplace=True)  # 用前面的值填充
df.fillna(method='bfill', inplace=True)  # 用后面的值填充
# 保存结果
df.to_csv('output.csv', index=False)

完整脚本示例

import pandas as pd
import sys
import os
def fill_csv_empty(input_file, output_file, fill_strategy='null'):
    """
    批量填充CSV空值
    :param input_file: 输入CSV文件路径
    :param output_file: 输出CSV文件路径  
    :param fill_strategy: 填充策略
    """
    try:
        # 读取CSV
        df = pd.read_csv(input_file, encoding='utf-8')
        print(f"原始数据量: {len(df)} 行")
        print(f"空值统计:\n{df.isnull().sum()}")
        if fill_strategy == 'null':
            # 填充为NULL字符串
            df.fillna('NULL', inplace=True)
        elif fill_strategy == 'zero':
            # 数字列填充0,文本列填充''
            for col in df.columns:
                if df[col].dtype in ['int64', 'float64']:
                    df[col].fillna(0, inplace=True)
                else:
                    df[col].fillna('', inplace=True)
        elif fill_strategy == 'mean':
            # 数字列用平均值,文本列用众数
            for col in df.columns:
                if df[col].dtype in ['int64', 'float64']:
                    df[col].fillna(df[col].mean(), inplace=True)
                else:
                    df[col].fillna(df[col].mode()[0] if len(df[col].mode()) > 0 else '', inplace=True)
        elif fill_strategy == 'ffill':
            # 向前填充
            df.fillna(method='ffill', inplace=True)
        else:
            # 默认填充为'未知'
            df.fillna('未知', inplace=True)
        # 保存结果
        df.to_csv(output_file, index=False, encoding='utf-8')
        print(f"处理完成,已保存到: {output_file}")
        print(f"处理后空值统计:\n{df.isnull().sum()}")
    except Exception as e:
        print(f"处理出错: {e}")
# 使用示例
if __name__ == "__main__":
    fill_csv_empty('input.csv', 'output.csv', fill_strategy='zero')

使用命令行工具(Linux/Mac)

使用awk

# 将所有空值替换为 "NA"
awk 'BEGIN{FS=OFS=","} {for(i=1;i<=NF;i++) if($i=="") $i="NA"} 1' input.csv > output.csv
# 将特定列的空值替换
awk -F, 'BEGIN{OFS=","} {if($3=="") $3="0"; if($5=="") $5="unknown"} 1' input.csv > output.csv

使用sed

# 替换所有空字段为 "NULL"
sed 's/,,/,NULL,/g; s/,$/,NULL/g; s/^,/NULL,/g' input.csv > output.csv
# 重复执行直到没有空值
sed -i ':a; s/,,/,NULL,/g; ta' input.csv

使用PowerShell(Windows)

# 读取CSV并填充空值
$csvContent = Import-Csv "input.csv"
$csvContent | ForEach-Object {
    $_.PSObject.Properties | ForEach-Object {
        if ([string]::IsNullOrEmpty($_.Value)) {
            $_.Value = "N/A"
        }
    }
    $_
} | Export-Csv "output.csv" -NoTypeInformation

批量处理多个CSV文件

import pandas as pd
import glob
import os
def batch_fill_csv(folder_path, output_folder, fill_strategy='null'):
    """
    批量处理文件夹中所有CSV文件
    """
    # 创建输出文件夹
    os.makedirs(output_folder, exist_ok=True)
    # 获取所有CSV文件
    csv_files = glob.glob(os.path.join(folder_path, '*.csv'))
    for file_path in csv_files:
        try:
            # 读取文件
            df = pd.read_csv(file_path, encoding='utf-8')
            # 填充空值
            df.fillna('无数据', inplace=True)
            # 保存到输出文件夹
            filename = os.path.basename(file_path)
            output_path = os.path.join(output_folder, filename)
            df.to_csv(output_path, index=False, encoding='utf-8')
            print(f"处理完成: {filename}")
        except Exception as e:
            print(f"处理失败 {file_path}: {e}")
# 使用
batch_fill_csv('./input_folder/', './output_folder/')

交互式脚本(带参数)

import pandas as pd
import argparse
def main():
    parser = argparse.ArgumentParser(description='批量填充CSV空值')
    parser.add_argument('input', help='输入CSV文件路径')
    parser.add_argument('-o', '--output', default='output.csv', help='输出文件路径')
    parser.add_argument('-f', '--fill', default='null', 
                       choices=['null', 'zero', 'mean', 'ffill', 'bfill'],
                       help='填充策略')
    parser.add_argument('-v', '--value', help='自定义填充值')
    args = parser.parse_args()
    # 读取CSV
    df = pd.read_csv(args.input)
    if args.value:
        df.fillna(args.value, inplace=True)
    elif args.fill == 'null':
        df.fillna('NULL', inplace=True)
    elif args.fill == 'zero':
        df.fillna(0, inplace=True)
    elif args.fill == 'mean':
        numeric_cols = df.select_dtypes(include=['number']).columns
        for col in numeric_cols:
            df[col].fillna(df[col].mean(), inplace=True)
    # 保存
    df.to_csv(args.output, index=False)
    print(f"处理完成,输出: {args.output}")
if __name__ == "__main__":
    main()

使用方式:

python script.py input.csv -o output.csv -f zero
python script.py input.csv --value "NA"

建议

  1. 备份原始数据:处理前先备份原始CSV文件
  2. 选择合适策略:根据数据类型选择填充方式
  3. 大数据处理:如果文件很大,考虑分块读取
  4. 编码问题:注意文件编码(UTF-8/GBK)

选择适合你需求的脚本即可,最常用的是Python的Pandas库,功能强大且灵活。

抱歉,评论功能暂时关闭!