Создание таблицы с отсортированными данными
У меня есть данные из базы данных (много записей):
('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)