Python实现:获取CSV文件中数值Top20对应的行号
获取CSV中Top20最大值对应的行号(降序)
问题描述
正在处理一个小项目,已用Python处理时间戳与热力图数据,将数据按1-100行拆分。需要获取CSV中数值最大的20个值对应的行号并按降序排列,但现有代码只能拿到单个最大值,无法实现Top20的需求。
示例CSV数据
0.00088006474088529383 0.00015301444453664169 0.0001578056486084342 4.8472783963609083e-05 0.00018440120509040085 7.766234473424159e-05
理想输出
6 4 1 5 3 2
尝试的代码(仅能获取单个最大值)
with open('heatmap.csv', 'r') as heatnum: for line in heatnum: print(max(heatnum))
解决方案
要实现需求,需要同时记录每行的数值和行号,排序后提取前20个的行号。以下是两种可行的代码实现:
方法一:直观排序法
# 存储每行的数值和对应的行号 row_value_list = [] with open('heatmap.csv', 'r') as file: # enumerate的start=1让行号从1开始计数,匹配你的需求 for line_number, line_content in enumerate(file, start=1): # 去除行首尾的空白字符(包括换行符) cleaned_line = line_content.strip() # 跳过空行 if not cleaned_line: continue # 将字符串转为浮点数 try: value = float(cleaned_line) row_value_list.append( (value, line_number) ) except ValueError: # 处理非数值行(如果有的话) continue # 按数值降序排序,key指定按元组的第一个元素(数值)排序 row_value_list.sort(reverse=True, key=lambda x: x[0]) # 提取前20个的行号并输出 for value, line_num in row_value_list[:20]: print(line_num)
方法二:利用负数值排序(性能略优)
如果数据量很大,这种方式可以避免排序时的reverse操作,原理是将数值取负后升序排序,等价于原数值的降序排序:
row_value_list = [] with open('heatmap.csv', 'r') as file: for line_number, line_content in enumerate(file, start=1): cleaned_line = line_content.strip() if not cleaned_line: continue try: value = float(cleaned_line) # 存储负数值和行号,后续升序排序即可得到原数值的降序顺序 row_value_list.append( (-value, line_number) ) except ValueError: continue # 升序排序 row_value_list.sort() # 提取前20个的行号并输出 for neg_value, line_num in row_value_list[:20]: print(line_num)
代码说明
enumerate(file, start=1):自动为每行分配从1开始的行号,完美匹配你1-100行的需求。- 空行和非数值行处理:通过
strip()和try-except跳过无效行,避免程序报错。 - 排序逻辑:两种方法都能实现按数值降序排列,取前20个后提取行号输出。
内容的提问来源于stack exchange,提问作者theboy
相关产品推荐
相关产品推荐

