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

如何按列逐步将DataFrame写入CSV?含分类变量转哑码场景

问题解决:逐列处理CSV并写入目标文件

嘿,我来帮你搞定这个按列写入CSV的问题!其实你不用纠结手动用csv.writer逐列写,结合Pandas的特性就能更优雅地完成,而且还能避免很多坑。先理清楚你的需求和现有代码的问题,再给你两种可行方案。


你的问题回顾

你有如下CSV源数据:

sv_m1,rev,ioip,are
0,15.31,40,NJ
0,64.9,0,CX
0,18.36,20,FP
0,62.85,0,CX
0,10.31,20,NJ
0,12.84,10,CX
0,69.95,0,FP
0,32.81,20,BS

需求是:

  • 逐列读取并处理数据
  • 数值列(sv_m1、rev、ioip)直接写入
  • 分类列are转为哑变量后一次性写入4列
  • 你已经写了部分处理代码,但不清楚如何按列写入目标CSV

你现有的代码片段:

for column in cols_list:
    df_column = pd.read_csv('df_sample.csv', usecols=[column])
    #### Data processing##########
    if (attribute_dict[column] == 'CAT'):
        # attribute_dict contains mapping of column name and type
        df_target = pd.get_dummies(df_column[column], dummy_na=True, prefix=column)
        for target_column in list(df_target.columns):
            df_final[target_column] = df_target[[target_column]]
    else (attribute_dict[column] == 'NUM'):
        df_target = df_column
        df_target.fillna(value=0,inplace=True)
        df_final[column] = df_target

# Write into csv for each column.
with open('df_final.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, delimiter=',')
    /* Not sure what to do here */

解决方案

方案1:用Pandas直接写入(推荐,简单高效)

你的代码已经在构建df_final这个DataFrame了,完全可以直接用Pandas的to_csv方法一次性写入,它会帮你处理好列顺序和格式。另外,修改一下列合并的方式,避免报错:

import pandas as pd

# 先定义列名与类型的映射(根据你的实际情况调整)
attribute_dict = {
    'sv_m1': 'NUM',
    'rev': 'NUM',
    'ioip': 'NUM',
    'are': 'CAT'
}
cols_list = ['sv_m1', 'rev', 'ioip', 'are']

df_final = pd.DataFrame()

for column in cols_list:
    # 逐列读取源数据
    df_column = pd.read_csv('df_sample.csv', usecols=[column])
    
    # 数据处理逻辑
    if attribute_dict[column] == 'CAT':
        # 生成包含缺失值的哑变量
        df_target = pd.get_dummies(df_column[column], dummy_na=True, prefix=column)
        # 把所有哑变量列合并到df_final中
        df_final = pd.concat([df_final, df_target], axis=1)
    elif attribute_dict[column] == 'NUM':
        # 数值列填充缺失值为0,避免用inplace(防止链式赋值警告)
        df_target = df_column.fillna(value=0)
        df_final = pd.concat([df_final, df_target], axis=1)

# 写入目标CSV,index=False去掉自动生成的行索引
df_final.to_csv('df_final.csv', index=False)

方案2:真正逐列写入(适合超大文件,内存受限场景)

如果你的源文件特别大,无法一次性加载到内存,可以采用逐列处理+逐行写入的方式(注意CSV是按行存储的,不能单独写一列,必须凑齐每行的所有值再写入):

import pandas as pd
import csv

attribute_dict = {
    'sv_m1': 'NUM',
    'rev': 'NUM',
    'ioip': 'NUM',
    'are': 'CAT'
}
cols_list = ['sv_m1', 'rev', 'ioip', 'are']

# 先收集所有目标列的表头和处理后的列数据
header = []
processed_columns = []

for column in cols_list:
    df_column = pd.read_csv('df_sample.csv', usecols=[column])
    if attribute_dict[column] == 'CAT':
        df_target = pd.get_dummies(df_column[column], dummy_na=True, prefix=column)
        header.extend(df_target.columns.tolist())
        processed_columns.append(df_target)
    else:
        df_target = df_column.fillna(0)
        header.append(column)
        processed_columns.append(df_target)

# 逐行写入CSV
with open('df_final.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, delimiter=',')
    # 先写入表头
    writer.writerow(header)
    # 遍历每一行,把所有列的当前行值凑成一行写入
    for row_idx in range(len(processed_columns[0])):
        row_data = []
        for col_df in processed_columns:
            row_data.extend(col_df.iloc[row_idx].tolist())
        writer.writerow(row_data)

现有代码的小问题说明

  1. 当处理分类列生成多列哑变量时,用df_final[target_column] = df_target[[target_column]]的方式容易引发警告,改用pd.concat合并列更稳妥。
  2. CSV文件是按行存储的,不能单独写入某一列,必须把每行的所有列值组合好后再写入——这也是你之前困惑的核心点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:08:19