如何用Python Pandas检查CSV中HTTP协议并修改包大小列值
解决方法:用Pandas将HTTP协议的数据包大小改为负数
原代码问题分析
你写的代码里,dataset['Proto'].eq('http').any()是检查整个Proto列是否存在至少一个'http'值,而不是判断当前循环的行是否为HTTP协议。只要CSV里有一行是HTTP,循环的每一次都会触发print(dataset['Length']),所以会输出所有行的Length列。另外,Pandas不建议手动遍历行,矢量化操作才是更高效的正确姿势。
正确实现方式
方法一:矢量化修改(推荐)
直接用布尔索引定位HTTP行,批量修改Length值,效率远高于遍历:
import pandas as pd # 读取CSV时直接指定列名,避免后续修改 dataset = pd.read_csv( 'test.csv', names=['packet', 'Time', 'Source', 'Dest', 'Proto', 'Length', 'Info'], engine='python' ) dataset.index.name = 'packet' # 将所有Proto为'http'的行的Length取反 dataset.loc[dataset['Proto'] == 'http', 'Length'] *= -1 # 若要仅打印修改后的HTTP行的Length print(dataset.loc[dataset['Proto'] == 'http', 'Length'])
方法二:兼容大小写的修改
如果CSV里的协议名有大小写差异(比如HTTP、Http),可以先转小写再匹配:
dataset.loc[dataset['Proto'].str.lower() == 'http', 'Length'] *= -1
不推荐的遍历方式(仅作对比)
如果一定要遍历行(数据量小的时候可用),需要定位到当前行的Proto值:
for x in dataset.index: if dataset.loc[x, 'Proto'] == 'http': # 修改当前行的Length dataset.loc[x, 'Length'] *= -1 # 打印当前行的Length print(dataset.loc[x, 'Length'])
内容的提问来源于stack exchange,提问作者rp259
相关产品推荐
相关产品推荐

