【问题标题】:Duplicate columns when querying SQLAlchemy into Pandas DF?将 SQLAlchemy 查询到 Pandas DF 时出现重复的列?
【发布时间】:2015-06-15 23:29:38
【问题描述】:

我正在构建一个用于在星型模式数据库之上进行分析的 python 数据库,但由于数据框中的一些重复的列键,我在集成 pandas 和 sqlalchemy 时遇到了麻烦。

这是课程:

class Student(Base):
    __tablename__ = 'DimStudent'

    id = Column('StudentKey', Integer, primary_key=True)
    srcstudentid = ('SrcStudentId', Integer)
    firstname = Column('FirstName', String)
    middlename = Column('MiddleName', String)
    lastname = Column('LastName', String)
    lep = Column('LimitedEnglishProficiency', String)
    frl = Column('FreeReducedLunch', String)
    sped = Column('SpecialEducation', String)

class School(Base):
    __tablename__ = 'DimSchool'

    id = Column('SchoolKey', Integer, primary_key=True)
    name = Column('SchoolName', String)
    district = Column('SchoolDistrict', String)
    statecode = Column('StateCode', String)

class StudentScore(Base):
    __tablename__ = 'FactStudentScore'

    studentkey = Column('StudentKey', Integer, ForeignKey('DimStudent.StudentKey'), primary_key=True)
    teacherkey = Column('TeacherKey', Integer, ForeignKey('DimTeacher.TeacherKey'), primary_key=True)    
    schoolkey = Column('SchoolKey', Integer, ForeignKey('DimSchool.SchoolKey'), primary_key = True)
    assessmentkey = Column('AssessmentKey', Integer, ForeignKey('DimAssessment.AssessmentKey'), primary_key=True)
    subjectkey = Column('SubjectKey', Integer, ForeignKey('DimSubject.SubjectKey'), primary_key=True)
    yearcyclekey = Column('YearCycleKey', Integer, ForeignKey('DimYearCycle.YearCycleKey'), primary_key=True)
    pointspossible = Column('PointsPossible', Integer)
    pointsreceived = Column('PointsReceived', Integer)

    student = relationship("Student", backref=backref('studentscore'))
    school = relationship("School", backref=backref('studentscore'))
    assessment = relationship("Assessment", backref='studentscore')
    teacher = relationship("Teacher", backref='studentscore')
    subject = relationship("Subject", backref='studentscore')
    yearcycle = relationship("YearCycle", backref='studentscore')    

每当我查询我的数据时,我总是会想出重复的数据列,例如这个 ORM 调用中的学校键,然后从中构建一个数据框。

school = session.query(StudentScore, School, Subject)\    
.join(StudentScore.school).join(StudentScore.subject)\
.filter(School.name.like('%Dever%'))\
.filter(Subject.code == 'Math')

 a = pd.read_sql(school.statement, school.session.bind)

SO thread 提供了一种很好的转置技术来删除重复项。

 a = a.T.drop_duplicates().T

但是,当我在 IDE 变量资源管理器中与此数据框交互时,我仍然遇到错误。错误是:“重新索引仅对具有唯一值的索引对象有效”

知道问题出在哪里吗?

【问题讨论】:

  • 作为临时黑客,您可以使用 a.reset_index(inplace=True) 吗?
  • 我已经有一段时间没有做 sqlalchemy 了,但是你真的需要 .join(School) 吗?
  • 一个肮脏的解决方案可能是只做 a.drop_duplicates(inplace=true) pandas.pydata.org/pandas-docs/dev/generated/…
  • drop_duplicates 不行,仍然遇到同样的错误。我实际上不确定我是否需要 .join(school);当我通过安全连接回到办公室时将删除它。学校加入已经隐含在课程中。
  • .join 是一项要求。不确定没有它们会发生什么,因为它不会引发异常,但内存使用量会爆炸并使我的计算机崩溃:(

标签: python pandas sqlalchemy


【解决方案1】:

找到正确答案!而不是最简单的:

 a = a.T.drop_duplicates().T

我改为使用 groupby 来删除重复项:

df.T.groupby(level=0).first().T

也就是说,我不确定我最初的错误的驱动因素是什么。此外,新代码行的运行速度比旧代码行快 10-100 倍。

【讨论】:

  • 也发现了这个:stackoverflow.com/questions/22115819/… 相关问题,但似乎他们使用纯查询返回。如果他们可以为来自返回的重复项提出一个类似的优雅解决方案,我会永远爱他们。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2020-06-19
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
相关资源
最近更新 更多