在写入 pandas 数据帧之前在 SqlAlchemy 中设置列顺序
Set Order of Columns in SqlAlchemy before writing to pandas dataframe
我试图在使用 SQLAlchemy 构建 table 时设置列的顺序,截至目前列按字母顺序出现,我目前有:
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 时定义列的顺序对它们进行排序。因此,订单将是行动,employee_number,time_stamp,数量,part_number,card_number。我可以使用 Pandas 轻松地做到这一点,但这似乎是额外的(和不必要的)步骤。
我已经搜索了文档,google,& Whosebug,但似乎没有什么能真正满足我的需要。由于我对 SQLAlchemy 还是个新手,我很感激任何帮助。我的想法是否正确,因为我正在自动加载 table,所以我无法轻松定义列的顺序(我确定有解决方法,但不知道文档中的哪个位置可能会被发现)?
您的列未按您指定的顺序排列的原因与 sql 查询或 sqlalchemy 无关。这是因为您将查询输出转换为字典,然后将其提供给 DataFrame
.
由于字典在 python 中没有顺序,pandas 将按字母顺序对其进行排序以获得可预测的输出。
使用 dict 的当前方法,您可以随时通过 dfx.reindex(columns=['action', ..., 'card_number'])
更改列的顺序
除了解释为什么在您的情况下没有订购外,也许还有更好的方法来解决这个问题:
使用内置 pd.read_sql_query
。使用会话和查询对象时,可以将 selectable
属性传递给 read_sql_query
以将其转换为 DataFrame:
query = session.query(Table)...
df = pd.read_sql_query(query.selectable, engine)
- 不转换为字典,但将输出保留为您提供给
DataFrame
的元组:这将保持查询输出的顺序。
我试图在使用 SQLAlchemy 构建 table 时设置列的顺序,截至目前列按字母顺序出现,我目前有:
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 时定义列的顺序对它们进行排序。因此,订单将是行动,employee_number,time_stamp,数量,part_number,card_number。我可以使用 Pandas 轻松地做到这一点,但这似乎是额外的(和不必要的)步骤。
我已经搜索了文档,google,& Whosebug,但似乎没有什么能真正满足我的需要。由于我对 SQLAlchemy 还是个新手,我很感激任何帮助。我的想法是否正确,因为我正在自动加载 table,所以我无法轻松定义列的顺序(我确定有解决方法,但不知道文档中的哪个位置可能会被发现)?
您的列未按您指定的顺序排列的原因与 sql 查询或 sqlalchemy 无关。这是因为您将查询输出转换为字典,然后将其提供给 DataFrame
.
由于字典在 python 中没有顺序,pandas 将按字母顺序对其进行排序以获得可预测的输出。
使用 dict 的当前方法,您可以随时通过 dfx.reindex(columns=['action', ..., 'card_number'])
除了解释为什么在您的情况下没有订购外,也许还有更好的方法来解决这个问题:
使用内置
pd.read_sql_query
。使用会话和查询对象时,可以将selectable
属性传递给read_sql_query
以将其转换为 DataFrame:query = session.query(Table)... df = pd.read_sql_query(query.selectable, engine)
- 不转换为字典,但将输出保留为您提供给
DataFrame
的元组:这将保持查询输出的顺序。