0

私はこのように整理されたテーブル(curves.csv)を持っています(整理されていない方が良い説明です)

CL,D,PD,CL,D,PD,CL,D,PD,CL,D,PD,CL,D,PD
A,1,a,B,1,b,C,1,c,D,1,d,E,1,e
A,2,f,B,3,g,C,2,h,D,4,i,E,2,j
A,5,k,B,6,l,C,5,m,D,8,n,E,5,o

このテーブルをに変換したい

,A,B,C,D,E
1,a,b,c,d,e
2,f,,h,,j
3,,g,,,
4,,,,i,
5,k,,m,,o
6,,l,,,
8,,,,n,

私は現在これを持っています:

celllines=["A","B","C","D","E"]
sorted_days=["1","2","3","4","5","8"]
for d in sorted_days:
    curves=open("curves.csv","rU")
    for line in curves:
        line=line.rstrip().rsplit(",")
        if line[0]!="CL":#removes header
            for x in range(0,len(line),3):
                if line[x] in celllines:
                    if line[x+1] == d:
                        print d,line[x],line[x+2]
                    else:
                        print d, line[x],""



    curves.close()

答えが近づいているのではなく、さらに進んでいるような気がします。いつものように、どんなポインタでも大歓迎です

4

5 に答える 5

2

Rでも実行できることを(少し遅れて)示すために:

curves <- read.csv("curves.csv", as.is = TRUE)
stack  <- data.frame(CL = unlist(curves[, c(TRUE, FALSE, FALSE)]),
                     D  = unlist(curves[, c(FALSE, TRUE, FALSE)]),
                     PD = unlist(curves[, c(FALSE, FALSE, TRUE)]),
                     stringsAsFactors = FALSE)
library(reshape2)
output <- acast(stack, D ~ CL, value.var = "PD", fill = "")
write.csv(output, "new_curves.csv", quote = FALSE)

サードパーティのパッケージを使用したくない場合は、ベースを使用してすべてを行うことができます。

curves   <- read.csv("curves.csv", as.is = TRUE)
rownames <- sort(unique(unlist(curves[, c(FALSE, TRUE, FALSE)])))
colnames <- sort(unique(unlist(curves[, c(TRUE, FALSE, FALSE)])))
output   <- matrix("", nrow = length(rownames), ncol = length(colnames),
                       dimnames = list(rownames, colnames))
fill.i   <- match(unlist(curves[, c(FALSE, TRUE, FALSE)]), rownames)
fill.j   <- match(unlist(curves[, c(TRUE, FALSE, FALSE)]), colnames)
fill.x   <- unlist(curves[, c(FALSE, FALSE, TRUE)])
output[cbind(fill.i, fill.j)] <- fill.x
write.csv(output, "new_curves.csv", quote = FALSE)
于 2013-01-12T02:31:11.183 に答える
2

csvモジュールを使用して、このようなものはどうですか?

import csv

# make a dictionary to store the data
data = {}

# first, read it in
with open("curves.csv", "rb") as fp:

    # make a csv reader object
    reader = csv.reader(fp)

    # skip initial line
    next(reader)

    for row in reader:
        # for each triplet, store it in the dictionary
        for i in range(len(row)//3):
            CL, D, PD = row[3*i:3*i+3]
            data[D, CL] = PD

# see what we've got
print data

with open("newcurves.csv", "wb") as fp:
    # get the labels in order
    row_labels = sorted(set(k[0] for k in data), key=int)
    col_labels = sorted(set(k[1] for k in data))

    writer = csv.writer(fp)
    # write header
    writer.writerow([''] + col_labels)

    # write data rows
    for row_label in row_labels:
        # start with the label
        row = [row_label]

        # then extend a list of the data in order, using the empty string '' if
        # there's no such value
        row.extend([data.get((row_label, col_label), '') for col_label in col_labels])

        # dump it out
        writer.writerow(row)

これは私たちに次のような辞書を与えます

{('1', 'D'): 'd', ('1', 'E'): 'e', ('5', 'C'): 'm', ('1', 'B'): 'b', ('2', 'E'): 'j', ('1', 'C'): 'c', ('5', 'A'): 'k', ('6', 'B'): 'l', ('2', 'C'): 'h', ('1', 'A'): 'a', ('4', 'D'): 'i', ('8', 'D'): 'n', ('2', 'A'): 'f', ('3', 'B'): 'g', ('5', 'E'): 'o'}

とのような出力ファイル

~/coding$ cat newcurves.csv 
,A,B,C,D,E
1,a,b,c,d,e
2,f,,h,,j
3,,g,,,
4,,,,i,
5,k,,m,,o
6,,l,,,
8,,,,n,
于 2013-01-10T23:23:56.463 に答える
2

このような問題に取り組む最善の方法は、古い形式の分解と新しい形式の構築を分離することです。代わりに、古い形式をPythonでデータを簡単に操作できるようにする適切なデータ構造に分解し、その優れた順応性のある構造を使用して新しい形式を構築します。

カンマ区切りの値を使用する場合は常に、標準ライブラリにあるモジュールを使用してすべてを簡略化でき、このcsvのジョブを大幅に簡略化できます。

このソリューションは、リスト内包表記(およびさまざまないとこ)もかなり頻繁に使用するため、それらに精通していない場合は、少し読むことをお勧めします(前にリンクされているのはそれらを説明する私の短いビデオです)。

import csv
import itertools

def grouper(n, iterable, fillvalue=None):
    args = [iter(iterable)] * n
    return itertools.zip_longest(fillvalue=fillvalue, *args)

with open("curves.csv") as file:
    data = csv.reader(file)
    next(data) #Ignore header row.
    parsed = {(column, row): value for line in data
              for column, row, value in grouper(3, line)}

rows = sorted({row for (_, row) in parsed})
columns = sorted({column for (column, _) in parsed})

with open("output.csv", "w") as file:
    writer = csv.writer(file)
    writer.writerow([None] + columns)
    writer.writerows([[row]+[parsed.get((column, row))
                             for column in columns]
                      for row in rows])

ステートメントを使用してファイルを開くことから始めwith(ファイルを確実に閉じるためのベストプラクティス)、次にヘッダーの行をスキップしてデータを解析します。これを行うには、データの各行を取得し、その行を長さ3のチャンクにグループ化します(レシピであるgrouper()関数を使用)。これにより、列、行、および値が得られ、これらを辞書のキーおよび値として使用します。itertools

これにより、の辞書が得られ{("A", 1): "a", ...}ます。これは作業に適した形式なので、ファイルを目的の形式に戻します。

まず、必要な行と列を知る必要があります。これを行うには、解析されたデータから行のみを取得し、セットを作成し(セットには重複を含めることができないため)、最後にそれらをリストに並べ替えて、次のようにします。正しい順序。

次に、出力ファイルを開き、列をそのファイルに書き込み(None行ヘッダー列にを追加することを忘れないでください)、データを書き出します。各行について、行番号を書き込み、解析されたデータから各列の値を取得します。これを使用して、値がない場合にdict.get()取得します。Noneこれにより、必要な出力が得られます。

注:質問でPython 2.xを使用しているようですが、私の答えは3.xで書かれています。唯一の違いitertools.zip_longest()itertools.izip_longest()、3.xにあることです。

于 2013-01-10T23:41:31.153 に答える
1

csvモジュールを使用しない場合:

celllines=["","A","B","C","D","E"]
days=["1","2","3","4","5","6","7","8"]

curves = sum([line.split(',') for line in open("curves.csv","rU").read().split()[1:]], [])

group = {(d,cl): pd for (cl,d,pd) in [curves[i:i+3] for i in range(0,len(curves),3)]}
table = [[d if not x else '' for x in celllines] for d in days]

for (d,cl),pd in group.items():
    table[days.index(d)][celllines.index(cl)] = pd

with open("curves2.csv", "w") as f:
    f.write('\n'.join(','.join(line) for line in [celllines]+table))
于 2013-01-11T01:03:45.657 に答える
1

tapply連結関数を-ingするRソリューションc。

cvrs <- read.table(text="CL,D,PD,CL,D,PD,CL,D,PD,CL,D,PD,CL,D,PD
 A,1,a,B,1,b,C,1,c,D,1,d,E,1,e
 A,2,f,B,3,g,C,2,h,D,4,i,E,2,j
 A,5,k,B,6,l,C,5,m,D,8,n,E,5,o", header=TRUE, sep=",", check.names=FALSE)

long <- rbind(crvs[, 1:3], crvs[, 4:6], crvs[, 7:9], crvs[, 10:12])
out <- with( long, tapply(PD, list(D, CL), FUN=c) )
#-----------------
 write.table(out, quote=FALSE, sep=",", na="")
A,B,C,D
1,a,b,c,d
2,f,,h,
3,,g,,
4,,,,i
5,k,,m,
6,,l,,
8,,,,n
于 2013-01-12T05:09:54.080 に答える