CSV文件满足条件时如何定位行并实现独热编码?
解决CSV文件特征列的独热编码问题
你需要对CSV文件执行独热编码,规则如下:
- label列:
malware转为1,benign转为0; - md5列:保持原哈希值不变;
- 第3列及之后的特征列:检查每个特征是否存在于
feature-list.txt的特征列表中,匹配则转为1,不匹配则转为0。
你的CSV部分数据示例:
label,md5,create new key via CryptAcquireContext,delete user account group malware,0e498d2283a99aad9a997200caf2f24e,packed with UPX,delete user account group malware,1f0ffe101843e4135af712d899b0c0d3,inspect load icon resource,reference analysis tools strings
你已成功处理label列,但特征列的转换代码存在问题,无法正确匹配特征并转换为1。
问题分析
你现有代码中if (row[2::]) in headers:的逻辑错误:row[2::]是一个包含多个特征的列表,而headers是单个特征的列表,直接判断列表是否在列表中永远不会成立。需要逐个遍历每个特征项,检查是否存在于特征集合中。
解决方案
将特征列表转为集合(集合的成员查找效率远高于列表),然后遍历每行的特征列逐个替换:
import csv # 读取特征列表并转为集合,提升查找效率 feature_set = set() with open("feature-list.txt", 'r') as txt_file: for line in txt_file: feature = line.strip() if feature: # 跳过空行 feature_set.add(feature) # 处理CSV文件并写入结果 with open('cleaned_features-test-2.csv', 'r') as infile, open('onehot.csv', 'w', newline='') as outfile: reader = csv.reader(infile) writer = csv.writer(outfile) # 跳过原表头(若需要保留表头可删除此行并自行处理表头转换) next(reader) for row in reader: # 处理label列 row[0] = '1' if row[0] == 'malware' else '0' # 处理第3列及以后的特征列 for idx in range(2, len(row)): feature = row[idx].strip() row[idx] = '1' if feature in feature_set else '0' # 写入处理后的行 writer.writerow(row)
关键改进点
- 使用
set存储特征,将查找时间复杂度从O(n)降为O(1),处理大文件时效率更高; - 遍历每个特征列(
range(2, len(row))),逐个检查并替换; - 使用
with语句同时管理输入输出文件,自动处理文件关闭,避免资源泄漏; - 添加了空行判断,避免
feature-list.txt中的空行干扰匹配。
内容的提问来源于stack exchange,提问作者jack_dan
相关产品推荐
相关产品推荐

