【发布时间】:2015-06-30 20:03:36
【问题描述】:
当您将数据查询到 pandas 数据框时,有没有办法保留 SqlAlchemy 属性名称?
这是我的数据库的简单映射。对于学校表,我已将数据库名称“SchoolDistrict”重命名为更短的“地区”。我从 DBA 中删除了几层,因此在源代码中更改它们是不可行的。
class School(Base):
__tablename__ = 'DimSchool'
id = Column('SchoolKey', Integer, primary_key=True)
name = Column('SchoolName', String)
district = Column('SchoolDistrict', String)
class StudentScore(Base):
__tablename__ = 'FactStudentScore'
SchoolKey = Column('SchoolKey', Integer, ForeignKey('DimSchool.SchoolKey'), primary_key = True)
PointsPossible = Column('PointsPossible', Integer)
PointsReceived = Column('PointsReceived', Integer)
school = relationship("School", backref='studentscore')
所以当我查询类似:
query = session.query(StudentScore, School).join(School)
df = pd.read_sql(query.statement, query.session.bind)
在返回的 DataFrame df 中,我最终得到了列的底层“SchoolDistrict”名称,而不是我的属性名称。
编辑: 更烦人的情况是跨表存在重复的列名。例如:
class Teacher(Base):
__tablename__ = 'DimTeacher'
id = Column('TeacherKey', Integer, primary_key=True)
fname = Column('FirstName', String)
lname = Column('FirstName', String)
class Student(Base):
__tablename__ = 'DimStudent'
id = Column('StudentKey', Integer, primary_key=True)
fname = Column('FirstName', String)
lname = Column('FirstName', String)
因此,跨两个表(如下表)的查询会生成一个包含重复 FirstName 和 LastName 列的数据框。
query = session.query(StudentScore, Student, Teacher).join(Student).join(Teacher)
是否可以在查询时重命名这些列?现在,我对这两种列名系统感到头疼。
【问题讨论】:
-
您好,您可以尝试在此SO answer 中执行
select as,或者您可以在读取数据框后更改列的名称。希望对您有所帮助。 -
嗯。所以 select 方法会起作用,但会迫使我远离更纯粹的 orm 方法。重命名列也会有点不方便,因为有很多变量名称不好和不明确。我真的在寻找一种在映射级别重命名并忘记实际名称的方法。
-
我当然可能错了,但我认为不可能。 Pandas
read_sql正在使用sqlalchemy提供的 sql 语句,除非您更改语句,否则它将具有错误的名称(sqlalchemy之后映射它,即在运行查询之后,在处理结果时) .在 pandas 中,没有办法像您建议的那样进行映射;如果您可以更改列的名称,为什么会有?祝你好运! -
该死。所以也许我需要建立一个所有列的字典,并在拉取数据框后将其全部映射......
-
是的,我想这是最简单的方法。但请记住,您可以使用反射从
sqlalchemy类中获取您的字典。你知道我的意思吗?
标签: python pandas sqlalchemy