在Python中执行类似SQL的连接并存储在嵌套字典中
在两个文本文件上执行类似SQL的Python连接的最佳方法是什么?我将尝试检索每个学生的姓名、课程和成绩?所以类似于在Python中执行类似SQL的连接并存储在嵌套字典中,python,pandas,list,dictionary,Python,Pandas,List,Dictionary,在两个文本文件上执行类似SQL的Python连接的最佳方法是什么?我将尝试检索每个学生的姓名、课程和成绩?所以类似于选择Students.name,Grades.Coursename,Grades.LetterGrade FROM Grades,Students WHERE Grades.ID=Students.ID 我可以通过使用列表理解指定ID号来映射任何特定人员的等级: hello = [item for item in customfunction() if item[0]=='1010
选择Students.name,Grades.Coursename,Grades.LetterGrade FROM Grades,Students WHERE Grades.ID=Students.ID
我可以通过使用列表理解指定ID号来映射任何特定人员的等级:
hello = [item for item in customfunction() if item[0]=='10103']
使用列表理解和指定ID的字典:
hello = [['10103', 'SSW 567', 'A', '98765'], ['10103', 'SSW 564', 'A-', '98764'], ['10103', 'SSW 687', 'B', '98764'], ['10103', 'CS 501', 'B', '98764']]
#Get course names
b = [el[1] for el in hello]
#Get grades for each course
c = [el[2] for el in hello]
gradedict = {}
for el in b:
for el2 in c:
gradedict.update({el: el2})
print(gradedict)
输出-前两个元素的输出明显不正确:
{'SSW 567': 'B', 'SSW 564': 'B', 'SSW 687': 'B', 'CS 501': 'B'}
然而,print(c)
产生了['A','A-','B','B']
在任何情况下,我如何能够有效地为文件中的每个ID执行此操作?理想的输出是一个嵌套字典,即{StudentName:{CourseName:Grade}}
Grades.txt有以下内容(用\t分隔,即一个选项卡):
Students.txt包含以下内容:
10103 Baldwin, C SFEN
10172 Forbes, I SFEN
pandas.DataFrame
pandas
库的merge
方法,它将为您提供内部联接
.txt
中,因此应按如下方式加载数据
import pandas as pd
grades = pd.read_csv('Grades.txt', sep="\t", header=None)
students= pd.read_csv('Students.txt', sep="\t", header=None)
# set columns
grades.columns = ["id", "name", "etc."]
students.columns = ["id", "name", "etc."]
# after loading two data as `pandas.DataFrame`, use `merge` to inner join
inner_join = pd.merge(grades, students, on='id')
您不需要使用多个列表理解和for循环,您只需在字典中使用列表理解来构造所需的gradedict,如下所示:
hello = [['10103', 'SSW 567', 'A', '98765'], ['10103', 'SSW 564', 'A-', '98764'], ['10103', 'SSW 687', 'B', '98764'], ['10103', 'CS 501', 'B', '98764']]
gradedict = {el[1]: el[2] for el in hello}
您可以这样尝试:
import pandas as pd
df1 = pd.read_csv("Grades.txt", sep='\t', header=None)
df2 = pd.read_csv("Students.txt",sep='\t',header=None)
df1.columns = ["id", "degree", "etc"]
df2.columns = ["id", "name", "c"]
df = pd.merge(df1, df2, on='id')
Students.txt也用分隔符分隔\t@JimT好!!然后你可以阅读
Students.txt
和Grades.txt
一样的内容,我有没有办法先按课程名称排序,然后再按学生姓名排序?我试过df3=df[[“name”,“class”,“lettergrade”]]。排序值([“class”,“name”)).groupby(“name”).head(10)
,但这只是在整个列表中按类排序,根本不按名称分组。。groupby('id')
做到了这一点,一个额外的列并不是我最初所希望的,但最终的结果是我想要的。这确实将正确的字母等级映射到每门课程,但我如何才能匹配学生列表中每个学生的等级集呢?
import pandas as pd
df1 = pd.read_csv("Grades.txt", sep='\t', header=None)
df2 = pd.read_csv("Students.txt",sep='\t',header=None)
df1.columns = ["id", "degree", "etc"]
df2.columns = ["id", "name", "c"]
df = pd.merge(df1, df2, on='id')