Python 使用排序数据创建表

Python 使用排序数据创建表,python,python-3.x,pivot-table,Python,Python 3.x,Pivot Table,我有来自数据库的数据(许多记录): 我可以将这些数据写入CSV文件或列表,但如何通过python 3.4使表具有结构,并按名称和组名称排序: Name group1 group2 group3 ... groupN Alex True False False ... Alex1 True False False ... ... 也许您可以帮助我。假设您已将数据库中的数据读取到元组列表中,您可以尝试以下操作: import csv data = [('group1', 27

我有来自数据库的数据(许多记录):

我可以将这些数据写入CSV文件或列表,但如何通过python 3.4使表具有结构,并按名称和组名称排序:

Name  group1 group2 group3 ... groupN
Alex  True   False  False  ... 
Alex1 True   False  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)

首先,通过创建一组使用过的名称,然后对它们进行排序,确定所需列名的列表
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])
给您一个输出文件:

名称、组1、组2、组3
亚历克斯,对,错,错
亚历克斯1,对,错,错
戴夫,假,假,真
凯特,假,真,假
Stive,False,True,False
Stive2,假,真,假

理想情况下,您应该在写入文件之前对数据库进行排序和分组。这是您的选择吗?我可以在写入文件之前对数据进行排序。“您可以选择熊猫吗?”>可以。请使用pada对数据进行排序并保存。如果您有问题,请在通过google和SO搜索您的错误后返回您的代码,然后提出一个新问题,然后再提出一个新问题,如果您有问题,请提供您的代码。谢谢您Ajax1234,但问题是-我不知道这些组的名称(之前将其添加到脚本中)@Oleksii当您从数据库检索数据时,第一列中是否有与“组”+数字匹配的字符串或其他内容?是的,我有您设置的列表(第一列-这是组名称):数据=[('group1',272',Alex'),('group1',268',Alex1'),('group2',267',Kate'),('group2',138','Stive'),('group2',3081',Stive2')),('group3',265,'Dave')但是1)我有更多的组,2)我有许多名字出现在不同的组数据=[('group1',521,'Alex'),('group1',155,'Alex1'),('group1',267,'Kate'),('group2',138,'Alex'),('group2',268,'Dave'),('group3',1323,'Alex'),('group3',171,'Stive'),('group4',284,'Alexі').('groupN','Name')。]@Oleksii感谢您的反馈。请看我最近的编辑。马丁,非常感谢。
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])