排序多列.csv文件Python

时间:2015-10-26 23:46:34

标签: excel sorting python-3.x

我的数据如下:

549  648.077  0.01
552  648.141  0.45
554  647.167  0.1
572  648.141  0.3
530  630.213  0.69
560  670.312  0.70

文件中有几千行

1st行的值范围为0-1100

2nd行的值范围为600-700

3rd行值范围为0-1 我需要绘制数据,因此需要对数据进行排序和修改:

我需要将第3行值(正常范围0.0-1.0)拆分为细分0.0-0.200.21-0.400,41-0,600.61-0.80,{{1} }

接下来,我需要将0.81-1.00行(正常范围(1st)中的细分为0-11000-1011-20等细分最多1100。 我想要做的是在区域21-302nd0.0-0.200-100.0-0.20和{{中找到所有11-20行值1}}。

找到后我想将它们全部加在一起并将值除以出现次数以得到平均值:所以我想要一个0.0-0.2021-30之间的区域{{1} }。我对python很新,我认为这是某种方法:

0.0-0.20

这应该有效(没有打印当然)来获取重复的值,而不是0-10 .....这应该给我带来我想要的值但是有一个简单的方法来设置范围从0-1100开始以10个单位步骤?

P.S。:我知道我为一个相对较短的问题提供了很多信息,那是因为我不知道python是否是最好的方法,如果我的方法是合理的?也许我应该选择value,但我刚安装了。因此,如果有人知道更简单(也许不是编码相关)的方式来解决这样的问题,我真的很感激。

1 个答案:

答案 0 :(得分:1)

您需要一个排序键才能以正确的顺序存储数据;然后你可以循环通过它来分组并得到你的总和。 itertools.groupby非常适合此类事情:

import os
import csv
from itertools import groupby

data_list = []
with open("table.csv") as csv_file:
    data_reader = csv.reader(csv_file, dialect='excel-tab')
    for row in data_reader:
        # read and convert data
        data_list.append((int(row[0]), float(row[1]), float(row[2])))

def classify(row):
    # returns classification of row based on third value, then first value
    # i.e. [549, 648.077, 0.01] -> (0.0, 540)
    #      [572, 648.141, 0.3]  -> (0.3, 570)
    first, second, third = row
    for level3 in (0.2, 0.4, 0.6, 0.8):
        if third <= level3:
            break
    else:
        level3 = 1.0
    for level1 in range(10, 1100, 10):
        if first <= level1:
            break
    else:
        level1 = 1100
    return level3, level1

data_list.sort(key=classify)

plot_values = []

for key, group in groupby(data_list, classify):
    group = list(group)
    number_of_elements = len(group)
    mean = sum([r[2] for r in group]) / number_of_elements
    plot_values.append((key, mean))

print('\n'.join(['%-10s -> %s' % (k, m) for k, m in plot_values]))

针对您提供的示例数据运行时:

(0.2, 550) -> 0.01
(0.2, 560) -> 0.1
(0.4, 580) -> 0.3
(0.6, 560) -> 0.45
(0.8, 530) -> 0.69
(0.8, 560) -> 0.7