如何从多个同结构CSV文件中提取每行的最大值对应记录?
如何从多个结构相同的CSV文件中按类别提取最大值记录?
问题描述
我有若干结构相同的CSV文件,每个文件的内容如下(示例):
File 1
Id Values A1 0.2 B1 0.5 C1 0.1 D1 0.3
File 2
Id Values A2 0.1 B2 0.4 C2 0.8 D2 0.1
File 3
Id Values A3 0.4 B3 0.2 C3 0.05 D3 0.9
File 4
Id Values A4 0.7 B4 0.1 C4 0.3 D4 0.2
需要从所有文件中,针对每一行的类别(A类、B类、C类、D类,即Id的首字母)提取Values列数值最大的对应Id和Values记录,最终期望得到如下结果:
Id Values A4 0.7 B2 0.4 C2 0.8 D3 0.9
解决方案
这里有两种实用的方法,分别适合不同的使用场景:
方法1:使用Python脚本(适合需要灵活扩展的场景)
这个方法通过Python的csv模块处理文件,逻辑清晰,后续调整需求也很方便:
import csv import glob # 初始化字典,存储每个类别(A/B/C/D)的最大Values和对应Id max_records = {} # 遍历当前目录下所有csv文件 for file_path in glob.glob("*.csv"): with open(file_path, 'r') as f: # 注意:示例文件用制表符分隔,若你的文件是逗号分隔,把delimiter改成',' reader = csv.DictReader(f, delimiter='\t') for row in reader: category = row['Id'][0] # 提取Id首字母作为类别标识 current_value = float(row['Values']) # 若类别未记录,或当前值更大,则更新记录 if category not in max_records or current_value > max_records[category]['value']: max_records[category] = { 'id': row['Id'], 'value': current_value } # 打印最终结果 print("Id Values") for category in sorted(max_records.keys()): print(f"{max_records[category]['id']} {max_records[category]['value']}")
小提示:如果需要把结果写入新文件,只需把最后打印的部分改成写入CSV的逻辑即可。
方法2:使用awk命令行工具(适合快速批量处理的场景)
如果你熟悉Linux/Unix命令行,用awk可以不用写完整脚本,直接终端执行完成任务:
awk ' BEGIN { print "Id Values" } NR == 1 { next } # 跳过所有文件的表头 { category = substr($1, 1, 1) # 提取Id首字母作为类别 current_val = $2 + 0 # 转换为数值类型,避免字符串比较误差 # 更新对应类别的最大值记录 if (!(category in max_val) || current_val > max_val[category]) { max_val[category] = current_val max_id[category] = $1 } } END { # 按A/B/C/D顺序输出结果 for (cat in max_id) { print max_id[cat] " " max_val[cat] } } ' *.csv | sort -k1.1,1.1
使用说明:直接在终端运行这条命令,会自动处理当前目录下所有CSV文件,sort -k1.1,1.1用来保证输出按A、B、C、D的顺序排列。
内容的提问来源于stack exchange,提问作者Pritam Deka
相关产品推荐
相关产品推荐

