Python - конвертировать матрицу в крайний список / длинную форму
У меня очень большой CSV-файл с такой матрицей:
null,A,B,C
A,0,2,3
B,3,4,2
C,1,2,4
Это всегда * n матрица. Первый столбец и первый ряд являются именами. Я хочу преобразовать его в формат из 3 столбцов (также может называться крайний список, длинную форму и т. Д.) Следующим образом
A,A,0
A,B,2
A,C,3
B,A,3
B,B,4
B,C,2
C,A,1
C,B,2
C,C,4
Я использовал:
row = 0
for line in fin:
line = line.strip("\n")
col = 0
tokens = line.split(",")
for t in tokens:
fout.write("\n%s,%s,%s"%(row,col,t))
col += 1
row += 1
не работает...
Не могли бы вы помочь? Спасибо..
2 ответа
Решение
Вам также нужно перечислить заголовки столбцов при распечатке отдельных ячеек.
Для матричного файла mat.csv:
null,A,B,C
A,0,2,3
B,3,4,2
C,1,2,4
Следующая программа:
csv = open("mat.csv")
columns = csv.readline().strip().split(',')[1:]
for line in csv:
tokens = line.strip().split(',')
row = tokens[0]
for column, cell in zip(columns,tokens[1:]):
print '{},{},{}'.format(row,column,cell)
распечатывает:
A,A,0
A,B,2
A,C,3
B,A,3
B,B,4
B,C,2
C,A,1
C,B,2
C,C,4
Для генерации верхней диагонали вы можете использовать следующий скрипт:
csv = open("mat.csv")
columns = csv.readline().strip().split(',')[1:]
for i, line in enumerate(csv):
tokens = line.strip().split(',')
row = tokens[0]
for column, cell in zip(columns[i:],tokens[i+1:]):
print '{},{},{}'.format(row,column,cell)
что приводит к выводу:
A,A,0
A,B,2
A,C,3
B,B,4
B,C,2
C,C,4
Вам нужно пропустить первый столбец в каждой строке:
for t in tokens[1:]: