gpt4 book ai didi

python - 在 Python 中从 CSV 文件排序数据并生成表输出

转载 作者:行者123 更新时间:2023-11-28 23:05:32 26 4
gpt4 key购买 nike

假设我有以下 CSV 文件 (subjects.csv)

subjects,name1,name2,name3
Chemistry,Tom,Will,Rob
Biology,Megan,Sam,Tim
Physics,Tim,Will,Bob
Maths,Will,Tim,Joe

我想找出哪对学生同类,只关注蒂姆、汤姆和威尔。我将如何在 Python 中配对它们?

Tim 和 Will 一起上了 2 个课。

Tom 和 Will 一起上了一节课。

此外,我想将其绘制在一个表格上,就像我在下面所写的那样,它在两个轴上都有名字,并且一对学生共享的类(class)数量(名字按字母顺序升序或降序排列) ..我已经阅读了有关如何为整个 CSV 文件生成表格的信息,但我无法从头开始制作表格,同时从 CSV 文件中剥离列和行..

             Tim        Tom     Will

Tim 0 0 0

Tom 0 0 1

Will 2 0 0

这超出了我的个人技能水平,但我仍然想知道如何去做并尝试理解。

最佳答案

您可以创建一个字典,其中包含每个学生正在上的课:

>>> import csv
>>> import collections
>>> D = collections.defaultdict(set)
>>> with open('subjects.csv','rb') as f:
... subject_reader = csv.reader(f)
... header = subject_reader.next()
... for row in subject_reader:
... for name in row[1:]:
... D[name].add(row[0])
...
>>> import pprint
>>> pprint.pprint(dict(D))
{'Bob': set(['Physics']),
'Joe': set(['Maths']),
'Megan': set(['Biology']),
'Rob': set(['Chemistry']),
'Sam': set(['Biology']),
'Tim': set(['Biology', 'Maths', 'Physics']),
'Tom': set(['Chemistry']),
'Will': set(['Chemistry', 'Maths', 'Physics'])}
>>>

要检查人们一起上了多少节课,您可以使用 set 的交集方法:

>>> D['Tom'].intersection(D['Will'])
set(['Chemistry'])
>>> len(_)
1
>>> D['Tim'].intersection(D['Will'])
set(['Maths', 'Physics'])
>>> len(_)
2
>>>

要打印出示例中的表格,您可以执行以下操作:

>>> EXAMPLE_NAMES = ['Tom','Tim','Will']
>>> for y_name in EXAMPLE_NAMES:
... print '{0:{width}}'.format(y_name,width=5),
... for x_name in EXAMPLE_NAMES:
... if y_name==x_name:
... print '{0:{width}}'.format('-'*5, width=5),
... else:
... print '{0:{width}}'.format(len(D[y_name].intersection(D[x_name])), width=5),
... print
...
Tom ----- 0 1
Tim 0 ----- 2
Will 1 2 -----

表格的标题可能如下所示:

    >>> for x_name in [' ']+EXAMPLE_NAMES:
... print '{0:{width}}'.format(x_name, width=5),
...
Tom Tim Will

正如 John 在评论中提到的,我正在将名称硬编码到列表中,以模仿您在上面给出的示例。要查看整个表,您可以从使用 .iterkeys().keys() 创建的字典中获取或迭代键:

>>> import csv
>>> import collections
>>>
>>> my_d = collections.defaultdict(set)
>>> with open('subjects.csv','rb') as f:
... subject_reader = csv.reader(f)
... header = subject_reader.next()
... for row in subject_reader:
... for name in row[1:]:
... my_d[name].add(row[0])
...
>>> def display_header(D):
... for x_name in [' ']+D.keys():
... print '{0:{width}}'.format(x_name, width=5),
... print
...
>>> def display_body(D):
... for y_name in D.iterkeys():
... print '{0:{width}}'.format(y_name,width=5),
... for x_name in D.iterkeys():
... if y_name==x_name:
... print '{0:{width}}'.format('-'*5, width=5),
... else:
... print '{0:{width}}'.format(len(D[y_name].intersection(D[x_name])), width=5),
... print
...
>>> def display_table(D):
... display_header(D)
... display_body(D)
...
>>> display_table(my_d)
Sam Rob Megan Will Tim Joe Tom Bob
Sam ----- 0 1 0 1 0 0 0
Rob 0 ----- 0 1 0 0 1 0
Megan 1 0 ----- 0 1 0 0 0
Will 0 1 0 ----- 2 1 1 1
Tim 1 0 1 2 ----- 1 0 1
Joe 0 0 0 1 1 ----- 0 0
Tom 0 1 0 1 0 0 ----- 0
Bob 0 0 0 1 1 0 0 -----
>>>

关于python - 在 Python 中从 CSV 文件排序数据并生成表输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5925011/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com