从csv内的组中选择数据并将数据附加到文本fi

2024-10-02 08:23:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题,我现在不知道怎么解决。我有一个csv格式如下所示。现在我需要做的是执行一些匹配场景并将一些文本字符串附加到文件中。在

x,classA,uniqueclassindicator1,1,125,21.8,1,5.22,
x,classc,uniqueclassindicator1,3,125,21.8,2,5.22,
x,classd,uniqueclassindicator2,1,125,21.8,,,
x,classe,uniqueclassindicator2,2,125,21.8,,,
x,classBa,uniqueclassindicator2,3,125,21.8,,,
x,classBc,uniqueclassindicator2,4,125,21.8,,,
x,classAd,uniqueclassindicator3,1,125,21.8,2,2.56,
x,classc,uniqueclassindicator3,2,125,21.8,1,2.56,
x,classD,uniqueclassindicator3,3,125,21.8,,,
x,classa,uniqueclassindicator3,4,125,21.8,,,
x,classn,uniqueclassindicator4,1,125,21.8,,,
x,classm,uniqueclassindicator4,2,125,21.8,,,
x,classt,uniqueclassindicator4,3,125,21.8,,,
x,classd,uniqueclassindicator4,4,125,30.8,,,
x,classa,uniqueclassindicator4,5,125,31.8,,,
x,classn,uniqueclassindicator4,6,125,30.8,,,
x,classq,uniqueclassindicator5,1,125,35.8,1,3.31,3.1
x,classqe,uniqueclassindicator5,2,125,21.8,2,3.31,3.1 
x,classS,uniqueclassindicator5,3,125,21.8,3.31,3.1
x,classK,uniqueclassindicator5,4,125,21.8,,,
x,classL,uniqueclassindicator5,5,125,21.8,,,
x,classG,uniqueclassindicator5,6,125,21.8,,,
x,classH,uniqueclassindicator6,1,125,35.8,1,2.89,2.25   
x,classF,uniqueclassindicator6,2,125,21.8,3,2.89,2.25
x,classP,uniqueclassindicator6,3,125,21.8,2,2.89,2.25
x,classY,uniqueclassindicator6,4,125,21.8,,,
x,classU,uniqueclassindicator6,5,125,21.8,,,
x,classR,uniqueclassindicator6,6,125,21.8,,,

在整个示例中,假设从零开始的索引

您会注意到,在csv中,第2列是uniqueclassindicator,我需要为每个类执行以下操作。在

1.

如果第3列和第6列为1,并且第3列和第6列中的同一唯一类(不同的行)都是2,则生成字符串:

^{pr2}$

例如,在第15行,我们有一个确切的场景。所以字符串文本字符串需要读: text data text classq text data classqe text 3.31

在上面的文本字符串中,“classq”来自第1列第15列,“classqe”来自第1列第16行,“3.31”来自第8列第15行。在

只需重申一下,生成此字符串的匹配是针对该类中的uniqueclassindicator5,第3列和第6列都匹配(1-1&2-2)

2.

与1基本相同,但是当第3列和第6列为1,2和2,1时,情况就不同了。这发生在uniqueclassindicator3中,请参阅第7行作为示例。所以我们需要附加字符串:

text data text classc text data classAd text 2.56 #Note I have listed the class which had a 1 in column 16 first.`

3.

当给定类的第3列的1,2,3与第6列的1,2,3匹配时,幸运的是,这里我们只需要返回字符串中的8值,例如:

test data test data (column[8]) test data test

4

就像场景2,同样的事情发生了,但顺序不正确。因此,如果给定uniqueClassIdCator的列3=1-3,列6=1-3(场景3除外),那么创建以下字符串。在

data data (column[8]) data data.

我知道要做到这一点所需的代码不是最简单的,但如果有人能帮我实现这一点,我将非常感激他们。如果有任何不清楚的地方,请随时与我联系。非常感谢

编辑-运行Martijn Pieters提供的代码时

我尝试运行以下代码以匹配目标1、2和3。同时,我可以让目标1&2工作起来很容易。我不能让目标3起作用。在

from collections import defaultdict
import csv

# you probably can think up better names
fields = ('x', 'class', 'indicator', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8')

entries = defaultdict(list)

with open('test.csv', 'rb') as fd:
    reader = csv.DictReader(fd, fields)

    for row in reader:
        # each row is now a dictionary
        # make your numbers, numbers
        for field in fields[3:]:
            row[field] = row[field] and float(row[field])

        previous = entries[row['indicator']]
        for p in previous:

            ##Objective 1
            if (row['col3'], row['col6']) == (2, 2) and (p['col3'], p['col6']) == (1, 1):
                print 'text {p[class]} text {r[class]} text {r[col7]}'.format(p=p, r=row)
            # etc, testing againts previous rows with the same indicator
            ##Objective 2
            if (row['col3'], row['col6']) == (2, 1) and (p['col3'], p['col6']) == (1, 2):
                print 'data {p[class]} & {r[class]} data {r[col7]}'.format(p=p, r=row)
            ##Objective 3
            if (row['col3'], row['col6']) == (3, 3) and (p['col3'], p['col6']) == (2, 2) and (p['col3'], p['col6']) == (1, 1):
                print 'text data text data {r[col8]}'.format(p=p, r=row)     

        # remember this row for later rows to match against.
        previous.append(row)

你能告诉我我在目标3上做错了什么吗?我没有收到回溯,但也没有收到文本字符串。在


Tags: andcsv字符串texttestdata场景class
1条回答
网友
1楼 · 发布于 2024-10-02 08:23:57

您可以将列2键控的信息存储在字典中,以便于查找;对于每个唯一的列值,保留一个条目列表,以便以后进行匹配。在

一个collections.defaultdict()对象使第一部分变得简单。我将使用csv.DictReader()为每个列指定一个有意义的名称;而不是在精神上必须将每个列编号映射到一个含义,然后列就有了名称,更容易跟踪:

from collections import defaultdict
import csv

# you probably can think up better names
fields = ('x', 'class', 'indicator', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8')

entries = defaultdict(list)

with open(filename, 'rb') as fd:
    reader = csv.DictReader(fd, fields)

    for row in reader:
        # each row is now a dictionary
        # make your numbers, numbers
        for field in fields[3:]:
            row[field] = row[field] and float(row[field])

        previous = entries[row['indicator']]
        for p in previous:
            if (row['col3'], row['col6']) == (2, 2) and (p['col3'], p['col6']) == (1, 1):
                print 'text data text {p[class]} text data {r[class]} text {r[col8]}'.format(p=p, r=row)
            # etc, testing againts previous rows with the same indicator

        # remember this row for later rows to match against.
        previous.append(row)

这与第一个场景匹配,但其他场景也同样容易匹配。在

如果每个唯一类指示符的条目数很低,那么这应该足够有效。如果每个指标都有成百上千(或更糟)行,则需要开始针对每个场景(因为它们以不同的方式匹配),来加速查找。这可能需要更多的内存,用内存换取更快的速度。在

根据输入数据集打印测试以上内容:

^{pr2}$

调整代码以支持唯一的(col3, col6)元组:

from collections import defaultdict
import csv

# you probably can think up better names
fields = ('x', 'class', 'indicator', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8')

entries = defaultdict(dict)

with open(filename, 'rb') as fd:
    reader = csv.DictReader(fd, fields)

    for row in reader:
        # each row is now a dictionary
        # make your numbers, numbers
        for field in fields[3:]:
            row[field] = row[field] and float(row[field])

        key = (row['col3'], row['col6'])
        previous = entries[row['indicator']]

        # scenario 1
        if key == (2, 2) and (1, 1) in previous:
            p = previous[(1, 1)]
            print 'text data text {p[class]} text data {r[class]} text {r[col8]}'.format(p=p, r=row)

        # scenario 3
        if key = (3, 3) and (1, 1) in previous and (2, 2) in previous:
            print 'text data text data {r[col8]}'.format(r=row)

        # remember this row for later rows to match against.
        previous[key] = row

相关问题 更多 >

    热门问题