我正在尝试使用SQLAlchemy构建表时设置列的顺序,截至目前,列以字母顺序显示,我目前拥有:
def data_frame(query, columns):
def make_row(x):
return dict([(c, getattr(x, c)) for c in columns])
return pd.DataFrame([make_row(x) for x in query])
PackL = create_engine('mssql+pyodbc://u:pass@Server/db1?driver=SQL Server', echo=False)
Fabr = create_engine('mssql+pyodbc://u:pass@Server/db2?driver=SQL Server', echo=False)
Session = sessionmaker(bind=PackL)
session = Session()
Base = declarative_base()
metadata = MetaData()
class Tranv(Base):
__tablename__= "Transactions"
__table_args__= {'autoload': True, 'autoload_with':PackL}
newvarv = session.query(Tranv).filter_by(status='SCRAP').filter(Tranv.time_stamp.
between('2015-10-01', '2015-10-09'))
session.close()
dfx = data_frame(newvarv, ['action', 'employee_number', 'time_stamp', 'qty',
'part_number', 'card_number'])
当前的dfx具有按字母顺序排列的列,但是我希望它按照创建数据帧dfx时定义列的顺序对其进行排序。因此,顺序为操作,员工编号,时间戳,数量,零件编号,卡号。我可以使用Pandas轻松地做到这一点,但这似乎是额外的(和不必要的)步骤。
我已经搜索了文档,谷歌和stackoverflow,但似乎没有什么真的可以满足我的需求。由于我对SQLAlchemy还是很陌生,因此我感谢您的帮助。我是否认为是因为我正在自动加载表,所以我不能轻易定义列的顺序(我确定有解决方法,但是不知道在文档中可能找到的位置) ?
列不在指定顺序中的原因与sql查询或sqlalchemy无关。这是由于您将查询输出转换为字典,然后将其提供给造成的DataFrame
。
由于字典在python中没有顺序,因此熊猫会按字母顺序对其进行排序,以产生可预测的输出。
使用dict的当前方法,您始终可以通过执行以下操作来更改列的顺序 dfx.reindex(columns=['action', ..., 'card_number'])
除了解释为什么不按您的情况订购外,也许还有更好的方法来解决此问题:
使用内建的pd.read_sql_query
。使用会话和Query对象时,可以将selectable
属性传递给,read_sql_query
以将其转换为DataFrame:
query = session.query(Table)...
df = pd.read_sql_query(query.selectable, engine)
DataFrame
:这将保留查询输出的顺序。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句