如何按列逐步将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)
现有代码的小问题说明
- 当处理分类列生成多列哑变量时,用
df_final[target_column] = df_target[[target_column]]的方式容易引发警告,改用pd.concat合并列更稳妥。 - CSV文件是按行存储的,不能单独写入某一列,必须把每行的所有列值组合好后再写入——这也是你之前困惑的核心点。
内容的提问来源于stack exchange,提问作者Shuvayan Das
相关产品推荐
相关产品推荐

