1

一連のペアワイズ比較を実行しました (正確には 241 x 241)。
結果のファイルは次のようになります。

A,X,10
A,Y,20
X,Y,15

これをすべてのペアごとの比較を示す表に変換したいと思います。つまり、このようなもの

,A,X,Y
A,,10,20
X,10,,15
Y,20,15,,

この問題への取り組みを開始する方法さえわかりません。どんな助け、提案も大歓迎です!

4

2 に答える 2

2

ペアになったデータを 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
于 2012-12-12T01:51:22.080 に答える
1

もっと効率的な方法があると思いますが、このような方法を試すことができます。モジュールを使用し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)
于 2012-12-12T01:51:32.983 に答える