Pandas处理列结构不同的CSV文件时动态保留存在列的问题咨询
解决方法
你不需要写多分支判断逻辑,直接定义全量待保留的列列表,再和当前CSV的实际存在的列做交集过滤即可,既能保留你定义的列顺序,也会自动忽略不存在的列:
# 1. 先定义所有你需要保留的列,顺序按你期望的输出顺序排列即可 full_keep_cols = ['code', '@timestamp', 'message', 'name','ad.loginName','sourceServiceName','ad.destinationHosts','ID', 'deviceAction'] # 2. 动态过滤,仅保留当前CSV中实际存在的列 keep_col = [col for col in full_keep_cols if col in f.index.values]
注意事项
- 请统一列名的大小写,你原有代码中同时出现了
code和Code两种写法,大小写不一致会导致列匹配失败 - 如果你是用pandas处理CSV,还可以在读取阶段就完成列过滤,大文件场景下更节省内存:
import pandas as pd full_keep_cols = {'code', '@timestamp', 'message', 'name','ad.loginName','sourceServiceName','ad.destinationHosts','ID', 'deviceAction'} # 读取时直接过滤需要的列,不存在的自动忽略 df = pd.read_csv("目标文件路径.csv", usecols=lambda x: x in full_keep_cols)
原有逻辑的问题说明
你之前的判断语句本身存在语法逻辑错误:if 'ad.loginName' and 'sourceServiceName' and 'ad.destinationHosts' in f.index.values
这段代码的实际执行逻辑是:先判断'ad.loginName'的布尔值(非空字符串恒为True)、再判断'sourceServiceName'的布尔值(同样恒为True)、最后判断'ad.destinationHosts'是否存在于列中,三者取与,等价于你只判断了最后一个列是否存在,自然无法得到预期结果。
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

