Python数据集清洗求助:移除含-1的行失败问题
解决CIC2018数据集预处理的两个问题
问题1:移除含-1的行不彻底
问题原因
你的代码存在两个核心错误:
- 未将收集到的
dfs列表合并为merged_df,直接调用merged_df.to_csv属于逻辑漏洞(若未提前定义会直接报错); - 移除-1的操作仅作用于最后一个CSV文件的DataFrame(
df),而非合并后的完整数据集,导致保存的文件仍是未处理的原始合并数据,自然残留大量-1。
修正代码
import os import glob import pandas as pd dir_name = "/temp/CIC2018" csv_files = glob.glob(os.path.join(dir_name, "*.csv")) dfs = [] for csv_file in csv_files: df = pd.read_csv(csv_file, low_memory=False) dfs.append(df) print("Number of CSV files:", len(csv_files)) # 关键步骤:合并所有CSV文件的DataFrame merged_df = pd.concat(dfs, ignore_index=True) # 保存原始合并数据(可选) merged_df.to_csv("C:/temp/CIC2018/Output/CIC2018-Umodified-Merged.csv", index=False) print("Original Shape", merged_df.shape) # 对合并后的完整数据集移除含-1的行 print("Removing -1") cleaned_df = merged_df[~(merged_df.isin([-1])).any(axis=1)] print("Cleaned Shape:", cleaned_df.shape) # 保存清理后的数据 cleaned_df.to_csv("C:/temp/CIC2018/Output/CIC2018-Cleaned-Merged.csv", index=False)
问题2:触发KeyError
问题原因
merged_df.drop(index=rows_to_drop)中的rows_to_drop是完整DataFrame,但drop方法的index参数仅接受行索引标签值,而非整个DataFrame,因此触发索引不存在的报错。
修正代码
将index=rows_to_drop替换为index=rows_to_drop.index,或直接简化写法:
# 方式1:修正原代码 rows_to_drop = merged_df[merged_df.applymap(lambda x: x == -1).any(axis=1)] merged_df.drop(index=rows_to_drop.index, inplace=True) # 方式2:更简洁的直接过滤(推荐) merged_df = merged_df[~merged_df.applymap(lambda x: x == -1).any(axis=1)]
补充说明
若数据中存在字符串形式的"-1",需额外处理以确保彻底清理:
# 同时过滤数值-1和字符串"-1" cleaned_df = merged_df[~(merged_df.isin([-1, "-1"])).any(axis=1)]
内容的提问来源于stack exchange,提问作者typod
相关产品推荐
相关产品推荐

