Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中执行类似SQL的连接并存储在嵌套字典中_Python_Pandas_List_Dictionary - Fatal编程技术网

在Python中执行类似SQL的连接并存储在嵌套字典中

在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

在两个文本文件上执行类似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]=='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')
    
  • 加载熊猫库

  • 使用制表符分隔符将两个数据帧导入CSV

  • 设置列

  • 在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')