我有一个sqlite数据库和具有不同列名的数据框,但它们引用相同的东西。例如。
我的数据库汽车有车ID,名称和价格。
我的数据框 df 具有汽车标识,值和名称。
附加:我还想添加一个额外的日期'数据库中 df 中没有的列,并根据当前日期插入。
我想将df保存在数据库中,以便Id = Identity
,Price = Value
,Name = Name
和date = something specified by the user or current
所以我不能通常df.to_sql
(除非我重命名列名,但我想知道是否有更好的方法来做到这一点)
我首先尝试同步没有日期列cur.execute("INSERT INTO Cars VALUES(?,?,?)",df.to_records(index=False))
但是,上面的方法不起作用,并且给出了绑定错误的错误。另外,DB和DF中列的顺序不同
我甚至不确定如何处理我有额外日期列的部分,所以任何帮助都会很棒。下面是生成所有值的示例代码。
import sqlite3 as lite
con = lite.connect('test.db')
with con:
cur = con.cursor()
cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT, date TEXT)")
df = pd.DataFrame({'Identity': range(5), 'Value': range(5,10), 'Name': range(10,15)})
答案 0 :(得分:0)
你可以这样做:
cur.executemany("INSERT INTO Cars (Id, Name, Price) VALUES(?,?,?)", list(df.to_records(index=False)))
此外,您应该将数据框的dtype
属性指定为numpy.int32
,以满足表'汽车'
con = sqlite3.connect('test.db')
cur = con.cursor()
cur.execute("CREATE TABLE Cars(Id INT, Name TEXT, Price INT, date TEXT)")
df = pandas.DataFrame({'Identity': range(5), 'Value': range(5,10), 'Name': range(10,15)}, dtype=numpy.int32)
cur.executemany("INSERT INTO Cars (Id, Price, Name) VALUES(?,?,?)", list(df[['Identity', 'Value', 'Name']].to_records(index=False)))
query ="SELECT * from Cars"
cur.execute(query)
rows= cur.fetchall()
for row in rows:
print (row)