我正在尝试使用pandas创建一个sqlite数据库。
我可以使用以下方式保存数据:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine(path, echo=False)
df_flows.to_sql('flows', engine, if_exists='append', index=False, index_label='First')
我可以用
读回来df = pd.read_sql("SELECT * FROM flows WHERE First>1504101810 AND First<1504105409", engine)
数据在磁盘上,但我认为索引无法正常工作:
In [22]: from sqlalchemy.engine import reflection
In [23]: insp = reflection.Inspector.from_engine(engine)
In [24]: insp.get_indexes('flows')
Out[24]: []
现在我有两个问题:
1)为什么列First
不会显示insp.get_indexes('flows')
2)如何将1个或多个索引添加到我创建的数据库中。
编辑:
这是数据框的结构
In [25]: df_flows.dtypes
Out[25]:
Protocol object
Src object
SrcPort float64
Dst object
DstPort float64
Group ID int64
Port object
VPort int64
IP TOS object
VLAN ID float64
VLAN Pri float64
MPLS Exp float64
Application object
Packets int64
Messages int64
Bytes int64
First int64
Last int64
SrcSubnet object
DstSubnet object
dtype: object
答案 0 :(得分:0)
您没有显示数据框的结构,因此很难回答您的问题。但是,根据您的意见,我可以做出一些推论。
将数据库保存到sql时,设置index=False
。这意味着数据框上的任何索引都不会保存为数据库中的列。然后,继续指定一个索引标签,如果将index设置为False,则该标签不会产生任何影响。如果要重命名现有索引名称,则使用此参数。
index:布尔值,默认为True 将DataFrame索引写为列。
index_label:字符串或序列,默认为None 索引列的列标签。如果给出无(默认)和
index
为True,然后使用索引名称。 如果DataFrame使用MultiIndex,则应该给出一个序列。
必须通过数据库创建数据库索引,而不是pandas。