为重复的值集添加索引

时间:2017-07-23 11:39:17

标签: python-3.x csv

我有一个关于为重复的值集添加某种索引的可能性的问题。我有一个CSV文件,其中包含数百个钻孔的地质剖面图。每个地质层都有自己的数字代码,例如砂岩 - 24.有时钻孔重复自己。在我的结果文件中,我需要X和Y,底层值,图层厚度和图层的数字代码。如果我的轮廓/钻孔中有两层或多层相同的岩性,它们应该有某种指数(24.1或24.a; 24.2 / 24.b ......)。我无法找到在Stackoverflow上创建此索引的方法,这就是为什么我要求你的帮助。我的代码如下所示:

with open('GeoPrz_WYNIKI.csv', newline='') as file:
file = csv.reader(file, delimiter=';', quotechar='|')
measurements = list(file)
transf = []
last_xyz = None
for x, y, glub, idnazw, strop, grub, seria in measurements:
    strop = float(strop)
    grub = float(grub)
    spag = float(format((strop + grub), ".2f"))            
    for line in measurements:
        xyz = x, y, spag
        if xyz == last_xyz:
            continue
        if True:
            last_xyz = xyz
            transf.append([x, y, spag, seria])

输出如下:

347591.91   301467.92   19.78   1
347591.91   301467.92   106.06  24
347591.91   301467.92   118.68  25
347591.91   301467.92   120.08  24
347591.91   301467.92   274.3   27

所需的输出应如下所示:

347591.91   301467.92   19.78   1
347591.91   301467.92   106.06  24
347591.91   301467.92   118.68  25
347591.91   301467.92   120.08  24.1 (or 24a)
347591.91   301467.92   274.3   27

我真的很感谢你的帮助! 问候, 松。

1 个答案:

答案 0 :(得分:1)

您可以随时创建一个查找/计数器地图,以便在再次遇到该值时使用,例如:

with open('GeoPrz_WYNIKI.csv', newline='') as f:
    reader = csv.reader(f, delimiter=';', quotechar='|')
    transf = []  # the output list
    col_map = {}  # lets use a dict for column lookup / counter
    for row in reader:  # loop through the CSV row by row
        col_val = row[-1]  # the value in the last column
        if col_val in transf:  # we already encountered this value
            row[-1] = col_val + "." + transf[col_val]  # append it with the counter
            transf[col_val] += 1  # increase the counter
        else:
            transf[col_val] = 1  # create a counter for the next occurence
        # process the rest of the row if needed here
        # ...
        transf.append(row)  # add the (modified) row to the output list

当然,您可以根据需要解压缩和处理每个row,包括使用与上一个不同的列 - 这只是一个与所呈现的数据格式匹配的通用解析器,并将修改最后一列值每次重复出现都会增加反击。