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

标签 python csv

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

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

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

蒂姆和威尔一起参加两门类(class)。

汤姆和威尔一起上一节课。

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

             Tim        Tom     Will

    Tim   0           0       0

    Tom   0           0       1

    Will     2           0       0

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

最佳答案

您可以创建一个字典,其中包含每个学生正在参加的类(class):

>>> 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'])}
>>> 

要检查人们一起参加了多少类(class),您可以使用 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 

正如约翰在评论中提到的,我将名称硬编码到列表中,以模仿您上面给出的示例。要查看整个表,您可以使用 .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/

相关文章:

python - 我在执行 3 天前正常工作的代码时遇到这个奇怪的错误

python - 给定一个带有元组键的 python 字典,正确格式化字符串

python - 从一个 pandas 数据帧写入多个文件

python - 使用 Pandas Python 将 Dataframe 的列从类型对象转换为 int/float

python - 不能拆分,需要一个bytes-like对象,不是 'str'

php - 通过 Dropbox 更新图库网页?

python - 如何将 Pandas 数据添加到现有的 csv 文件中?

powershell - 如何更改数组列表的值

csv - 微软Azure的架构。 CSV 到 SQL

python - 如何在 httpie 中设置重试次数?