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

Python中如何将指定有效列和最后一列复制到另一个文件

实现方案

首选方案:纯Python实现(无需调用awk,无临时文件)

你已经在Python中拿到了符合筛选条件的列索引,直接读写CSV完成导出即可,逻辑更可控:

import csv

# 第一步:收集所有要保留的有效列索引(默认0起始,和Python读取顺序一致)
keep_cols = []
for f in range(X.shape[1]):
    if importances[indices[f]] > 0.01:
        keep_cols.append(indices[f])
        # 保留原有特征排名打印逻辑
        print("%d. feature %d (%f)" % (f + 1, indices[f], importances[indices[f]]))

# 第二步:读写文件完成导出,自动追加原文件最后一列
with open('file1.csv', 'r', encoding='utf-8') as in_f, open('file2.csv', 'w', encoding='utf-8', newline='') as out_f:
    reader = csv.reader(in_f)
    writer = csv.writer(out_f)
    for row in reader:
        # 拼接有效列+最后一列输出
        output_row = [row[i] for i in keep_cols] + [row[-1]]
        writer.writerow(output_row)

如果数据量不大,用pandas实现更简洁:

import pandas as pd

# 收集符合条件的列索引
keep_cols = [indices[f] for f in range(X.shape[1]) if importances[indices[f]]>0.01]
df = pd.read_csv('file1.csv')
# 筛选有效列+最后一列导出
df_output = df[ keep_cols + [df.columns[-1]] ]
df_output.to_csv('file2.csv', index=False)

备选方案:单次awk命令实现(无需循环生成临时文件)

不需要迭代生成临时文件,直接拼出要提取的列,一次awk执行即可完成需求:

import os

# 收集awk格式的有效列索引(awk列号从1起始,所以要+1)
awk_keep_cols = [str(indices[f]+1) for f in range(X.shape[1]) if importances[indices[f]]>0.01]
# 加上awk内置最后一列变量$NF,拼接打印逻辑
print_cols = ','.join([f'${col}' for col in awk_keep_cols] + ['$NF'])
awk_cmd = f"awk -F ',' -v OFS=',' '{{print {print_cols}}}' file1.csv > file2.csv"
os.system(awk_cmd)

原有尝试代码的问题

  • 定义的cmd1、cmd2字符串中的indices[f]、i是Python变量,未做插值处理,传递给awk后无法识别
  • 循环生成多个临时文件的逻辑冗余,执行效率极低,还容易出现文件读写冲突

内容的提问来源于stack exchange,提问作者J.T.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 10:24:05