3

SO、私は解決するのが難しい問題だと思うものを持っています.CSVを循環して異なる列のデータの出現回数をカウントするスクリプトがあります. このスクリプトはうまく機能し、参照用に以下に含まれています。

元のスクリプト

import csv
import datetime
import copy
from collections import defaultdict

with open(r"C:\Temp\test2.csv") as i, open(r"C:\Temp\results2.csv", "wb") as o:
    rdr = csv.reader(i)
    wrt = csv.writer(o)

    data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None
    for line in rdr:
        date = datetime.datetime.strptime(line[0], '%d/%m/%Y')

        name = (line[7], line[9])

        if date != currdate or not currdate:
            for v in data.itervalues(): v[:2] = v[2:]
            currdate = date

        wrt.writerow(line + data[name][:2])

        data[name][3] += 1
        if line[6] == "1": data[name][2] += 1

このスクリプトを編集してパーセンテージ列を追加し、このスクリプトで列一致の複数の異なる組み合わせを手動で行うことができます。たとえば、ここでは列 7/9 を列 7/10 にすることができます。ただし、必要な機能や方法がわかりません。基本的にcalclist、このスクリプトに含まれるそれぞれを調べて、calclist 内の列参照のすべての組み合わせについて、このスクリプトに関連付けられた数値を出力する必要があります。すなわち 6/7 6/19 6/23

私の実際のスクリプトでは、計算リストはこの例よりもはるかに長いため、この編集にタイトルを列に添付する何らかの方法が含まれていればいいのですが、これを行うための適切な方法やメカニズムがありません. ただし、計算リストのタイトルのリストがあった場合、この形式でタイトルを作成する方法がいくつかあります (スクリプトの実行ごとに 3 つあることを思い出してください)。"title1-title2-x","title1-title2-y","title1-title2-z"

import csv
import datetime
import copy
from collections import defaultdict

with open(r"dualparametermatch_test.csv") as i, open(r"dualparametermatch_test_edit.csv", "wb") as o:
    rdr = csv.reader(i)
    wrt = csv.writer(o)

    data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None

    # Identical calclists
    calclist = [6, 7, 19, 23, 25, 26, 35, 62, 64]
    calclist2 = [6, 7, 19, 23, 25, 26, 35, 62, 64]
    
    for counter, line in enumerate(rdr):
        if counter == 0:
            #Titles, there are three for each item in the calclist
            titles = ["titleX", "titleY", "titleZ"] # ... etc
            wrt.writerow(line + titles)
        else:
            extra_cols = []
            for calc in calclist:
                date = datetime.datetime.strptime(line[0], '%d/%m/%Y')
                name = (line[calclist], line[calclist2])

                if date != currdate or not currdate:
                    for v in data.itervalues(): v[:2] = v[2:]
                    currdate = date

                 ### Adds the percentage calulation column
                top,bottom = data[name][0:2]
                try:
                    quotient = '{0:0.5f}'.format(float(top)/bottom).rstrip("0")
                except ZeroDivisionError:
                    quotient = 0
                extra_cols.extend(data[name][:2]+ [quotient])

                data[name][3] += 1
                if line[6] == "1": data[name][2] += 1

            wrt.writerow(line + data[name][:2])

これは解決するのが難しい問題かもしれません。誰かがこれを手伝ってくれるなら、何よりもまずあなたに称賛を!詳細が必要な場合や不明な点がある場合は、ご連絡ください。必要に応じて、元のスクリプトのサンプル データと出力を提供できます。事前にありがとうAEA

4

2 に答える 2