2015-06-11 1 views
1

Я строю библиотеку данных python для анализа поверх базы данных схемы звездочек, и у меня возникают проблемы с интегрированием pandas и sqlalchemy из-за дублирования столбцов в кадре данных.Дублировать столбцы при запросе SQLAlchemy в Pandas DF?

Вот классы:

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

Всякий раз, когда я запрашиваю мои данные, я постоянно придумываю дублированные столбцы данных, например, ключ школы в этом ОРМЕ вызова, а затем построить dataframe от него.

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 

Однако я до сих пор работаю в ошибку, когда я общаюсь с этим dataframe в переменном исследователе IDE. Ошибка: «Reindexing действует только с уникально оцененными объектами индекса»

Любая идея, где проблема?

+0

Как временный взлом вы можете использовать a.reset_index (inplace = True)? – Gecko

+0

Я не делал sqlalchemy в то время, но вам действительно нужно .join (School)? – Gecko

+0

Грязным решением может быть просто сделать a.drop_duplicates (inplace = true) http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.drop_duplicates.html – PlagTag

ответ

1

Нашел правильный ответ! Вместо того, чтобы самый простой:

a = a.T.drop_duplicates().T 

вместо этого я использовал GroupBy для удаления дубликатов:

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

Тем не менее, я не уверен, что водители моей первоначальной ошибки были. Также новая строка кода работает на 10-100x быстрее старой.

+0

Также нашли это: http://stackoverflow.com/questions/22115819/handling-duplicate-columns- in-pandas-dataframe-constructor-from-sqlalchemy-join Связанный с этим вопрос, но похоже, что он использует возврат чистого запроса. Буду любил бы кого-нибудь навсегда, если бы они могли предложить подобное элегантное решение для дубликатов, поступающих из возврата. – AZhao

Смежные вопросы