假设我有一个大致这样的选择:
select instrument, price, date from my_prices;
如何将返回的价格拆包到单个数据框中,每个数据有一系列价格,并按日期编制索引?
要清楚:我在寻找:
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: ... Data columns (total 2 columns): inst_1 ... inst_2 ... dtypes: float64(1), object(1)
我不是在寻找:
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: ... Data columns (total 2 columns): instrument ... price ... dtypes: float64(1), object(1)
…这很容易;-)
更新 :最近的熊猫具有以下功能:read_sql_table和read_sql_query。
read_sql_table
read_sql_query
首先创建一个数据库引擎(连接也可以在这里工作):
from sqlalchemy import create_engine # see sqlalchemy docs for how to write this url for your database type: engine = create_engine('mysql://scott:tiger@localhost/foo')
请参见 sqlalchemy数据库URL。
docs/stable/generated/pandas.read_sql_table.html#pandas.read_sql_table)
table_name = 'my_prices' df = pd.read_sql_table(table_name, engine)
docs/stable/generated/pandas.read_sql_query.html#pandas.read_sql_query)
df = pd.read_sql_query("SELECT instrument, price, date FROM my_prices;", engine)
旧答案引用了已弃用的read_frame(有关该答案,请参阅此问题的版本历史记录)。
首先阅读 然后 对您的要求进行转换通常是很有意义的(因为在熊猫中这些转换通常是高效且可读的)。在您的示例中,您可以pivot得到以下结果:
pivot
df.reset_index().pivot('date', 'instrument', 'price')
注意:如果reset_index您未在中指定index_col,则可能会错过read_frame。
reset_index
index_col
read_frame