在Django中用Pandas读取Excel:如何保留未被覆盖的重复数据?
解决Django中读取Excel重复成绩数据被字典覆盖的问题
问题根源
Python字典的键具有唯一性,当你用dict(zip(成绩列, 日期列))时,重复的成绩(键)会被后续出现的同成绩对应的日期覆盖,导致只保留最后一个匹配的日期。
解决方案:将键对应的值改为列表
要保留所有重复成绩对应的日期,需要把GradesWDates改成**成绩: [日期1, 日期2, ...]**的结构,下面提供两种实现方式:
方法1:手动循环处理(直观易懂)
遍历成绩和日期的配对,遇到重复成绩时就把日期追加到对应列表中:
# 以Evan为例 evan_grades = Database.Evan evan_dates = Database.Date grades_with_dates = {} for grade, date in zip(evan_grades, evan_dates): # 跳过空值(可选,根据你的Excel数据情况调整) if pd.isna(grade) or pd.isna(date): continue if grade not in grades_with_dates: grades_with_dates[grade] = [] grades_with_dates[grade].append(date) # 创建Evan对象 Evan = skimask('Evan', grades_with_dates, "B", 0, 0, "./static/media/evan1.png", list(Database.EvanNext), [], 0)
方法2:用Pandas GroupBy简化代码(高效简洁)
利用Pandas的分组功能,直接把同一成绩对应的日期聚合为列表:
# 以Evan为例,先筛选有效数据(去掉空值) evan_data = Database[['Evan', 'Date']].dropna() # 按成绩分组,把日期转成列表后转成字典 grades_with_dates = evan_data.groupby('Evan')['Date'].apply(list).to_dict() # 创建Evan对象 Evan = skimask('Evan', grades_with_dates, "B", 0, 0, "./static/media/evan1.png", list(Database.EvanNext), [], 0)
批量处理所有学生
如果要简化所有学生的代码,可以写一个循环来生成Students列表,避免重复代码:
students_config = [ ('Evan', "B", "./static/media/evan1.png", 'EvanNext'), ('Felix', "B+", "./static/media/felix.png", 'FelixNext'), ('Hessel', "A+", "./static/media/hessel2.png", 'HesselNext'), ('Niels', "B", "./static/media/niels.png", 'NielsNext'), ('Sem', "A", "./static/media/sem1.png", 'SemNext'), ] Students = [] for name, motive, pfp, next_col in students_config: # 用GroupBy生成成绩-日期列表字典 student_data = Database[[name, 'Date']].dropna() grades_with_dates = student_data.groupby(name)['Date'].apply(list).to_dict() # 创建对象并加入列表 student = skimask( name, grades_with_dates, motive, 0, 0, pfp, list(Database[next_col]), [], 0 ) Students.append(student)
内容的提问来源于stack exchange,提问作者hesselvanherk
相关产品推荐
相关产品推荐

