一連のペアワイズ比較を実行しました (正確には 241 x 241)。
結果のファイルは次のようになります。
A,X,10
A,Y,20
X,Y,15
これをすべてのペアごとの比較を示す表に変換したいと思います。つまり、このようなもの
,A,X,Y
A,,10,20
X,10,,15
Y,20,15,,
この問題への取り組みを開始する方法さえわかりません。どんな助け、提案も大歓迎です!
一連のペアワイズ比較を実行しました (正確には 241 x 241)。
結果のファイルは次のようになります。
A,X,10
A,Y,20
X,Y,15
これをすべてのペアごとの比較を示す表に変換したいと思います。つまり、このようなもの
,A,X,Y
A,,10,20
X,10,,15
Y,20,15,,
この問題への取り組みを開始する方法さえわかりません。どんな助け、提案も大歓迎です!
ペアになったデータを dict に保存します。
result_dict = {
(A, X): 10,
(A, Y): 20,
(X, Y): 15,
}
および行/列ラベル:
cols = sorted(set(a for a, b in result_dict.iterkeys()))
rows = sorted(set(b for a, b in result_dict.iterkeys()))
次に、行を印刷する方法です...
for b in rows:
row = list(result_dict.get((a, b), None) for a in cols)
# print the row
もっと効率的な方法があると思いますが、このような方法を試すことができます。モジュールを使用しcsv
てデータをロード/解析し、それを書き戻しcsv
ます(ファイルに出力が必要な場合、つまり、そうでない場合は調整できます):
import csv
from collections import defaultdict
# Open the input file and read it all into a defaultdict
with open('table.csv', 'rb') as f:
reader = csv.reader(f)
# Dictionary to hold the nested values
# This will be keyed by the letter ID, and each line of
# the file will be written twice (so A,X,10 will be represented
# as {'A': {'X': 10}, 'X': {'A': 10}}
d = defaultdict(dict)
for row in reader:
d[row[0]][row[1]] = row[2]
d[row[1]][row[0]] = row[2]
# Now we open the output file and write out our defaultdict
with open('t_out.csv', 'wb') as o:
# Here our fieldnames will start with the 'empty' first header
# and then be comprised of the keys of the dictionary (which
# should contain all possible values for the table)
fieldnames = [' '] + d.keys()
writer = csv.DictWriter(o, fieldnames=fieldnames)
# In Python 2.7, you can use writer.writeheaders()
writer.writerow(dict((h, h) for h in fieldnames))
# Now iterate through our dictionary, creating a row
# dictionary that will contain the information to be written
for k, v in d.iteritems():
# Here we are putting the key in the 'empty' first column
v[' '] = k
writer.writerow(v)