Python统计多行列表指定列字符串行数及按列值频次删行方法
问题前提
首先明确你的表格数据对应的Python嵌套列表结构:外层列表每个元素是代表一行的子列表,每个子列表按顺序存储4列的值,示例初始化如下:
table = [ ["70782763", "Pilot", "17,54", "4,9"], ["74006423", "Pilot", "19,95", "4,9"], ["74924394", "Pilot", "16,06", "4,9"], ["70782763", "Auto", "20,9", "6,5"], ["70706423", "Track", "19,1", "5,9"], ["74924394", "Track", "19,4", "5,9"] ]
之前两种写法得不到正确结果的原因:
table.count('Pilot'):外层列表table的元素是行子列表,不存在值直接为"Pilot"的顶层元素,统计结果永远为0table[1].count('Pilot'):Python列表索引从0开始,table[1]仅指代第二行数据,只会统计这一行里Pilot的出现次数,无法覆盖全表的第二列
需求1实现:统计第二列为"Pilot"的行数
遍历所有行,逐行判断第二列(索引为1)的值是否为"Pilot",累计计数即可:
# 基础循环写法 pilot_count = 0 for row in table: if row[1] == "Pilot": pilot_count += 1 # 简洁生成器写法 pilot_count = sum(1 for row in table if row[1] == "Pilot")
针对示例数据,运行后得到的统计结果为3。
需求2实现:过滤第二列值出现次数少于3次的行
注意:不要在遍历原列表的同时直接删除元素,会触发索引偏移导致漏删数据。 正确逻辑是先统计第二列所有值的出现频次,再基于频次做列表过滤:
from collections import Counter # 统计第二列每个值的出现次数 col2_frequency = Counter(row[1] for row in table) # 保留满足频次要求的行 filtered_table = [row for row in table if col2_frequency[row[1]] >= 3]
针对示例数据,第二列各值的出现次数分别为:
- Pilot:3次(满足保留条件)
- Auto:1次(过滤删除)
- Track:2次(过滤删除)
最终过滤后的列表仅保留3条第二列为Pilot的行。
如果你还未将原始多行文本转换为上述嵌套列表结构,可先用以下代码完成解析:
raw_content = """70782763 Pilot 17,54 4,9 74006423 Pilot 19,95 4,9 74924394 Pilot 16,06 4,9 70782763 Auto 20,9 6,5 70706423 Track 19,1 5,9 74924394 Track 19,4 5,9""" # 按换行分割,跳过空行后每行按空格拆分为列 table = [line.split() for line in raw_content.splitlines() if line.strip()]
内容的提问来源于stack exchange,提问作者Stefano.t
相关产品推荐
相关产品推荐

