Создание таблицы с отсортированными данными

У меня есть данные из базы данных (много записей):

('group1', 272, 'Alex')
('group1', 268, 'Alex1')
('group2', 267, 'Kate')
('group2', 138, 'Stive')
('group2', 3081, 'Stive2')
...
('group3', 265, 'Dave')

Я могу записать эти данные в файл CSV или в список, но как получить таблицу со структурой и с сортировкой по имени и по имени_группы через python 3.4:

Name  group1 group2 group3 ... groupN
Alex  True   False  False  ... 
Alex1 True   False  False  ...
...

возможно ты можешь помочь мне.

2 ответа

Решение

Сначала определите список необходимых имен столбцов cols создавая набор используемых имен, а затем сортируя их. При этом вы можете построить словарь, содержащий все записи, которые присутствуют:

from collections import defaultdict
import csv

data = [('group1', 272, 'Alex'), ('group1', 268, 'Alex1'), ('group2', 267, 'Kate'), ('group2', 138, 'Stive'), ('group2', 3081, 'Stive2'),('group3', 265, 'Dave')]
cols = sorted(set(g for g, v1, v2 in data))
names = defaultdict(list)

for group, value, name in data:
    names[name].append(group)

with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow(['Name'] + cols)

    for name in sorted(names.keys()):
        csv_output.writerow([name] + [col in names[name] for col in cols])

Предоставление вам выходного файла:

Name,group1,group2,group3
Alex,True,False,False
Alex1,True,False,False
Dave,False,False,True
Kate,False,True,False
Stive,False,True,False
Stive2,False,True,False

Предполагая, что вы прочитали свои данные из базы данных в список кортежей, вы можете попробовать это:

import csv
data = [('group1', 272, 'Alex'), ('group1', 268, 'Alex1'), ('group2', 267, 'Kate'), ('group2', 138, 'Stive'), ('group2', 3081, 'Stive2'),('group3', 265, 'Dave')]
final_data = sorted([(c, *[a == i for i in ['group1', 'group2', 'group3']]) for a, b, c in data], key=lambda x:x[0])
print(final_data)
write = csv.writer(open('filename.csv'))
write.writerows([['Name', 'group1', 'group2', 'group3']]+final_data)

Выход:

[('Alex', True, False, False), 
 ('Alex1', True, False, False), 
 ('Dave', False, False, True), 
 ('Kate', False, True, False), 
 ('Stive', False, True, False), 
 ('Stive2', False, True, False)]

Изменить: для многих возможных групп:

groups = list(set(map(lambda x:x[0], data)))
final_data = sorted([(c, *[a == i for i in groups]) for a, b, c in data], key=lambda x:x[0])
write = csv.writer(open('filename.csv'))
write.writerows([['Name', *groups]]+final_data)
Другие вопросы по тегам