将pandas数据帧保存到具有不同列名的sqlite中?

时间:2016-04-13 09:05:43

标签: python pandas sqlite

我有一个sqlite数据库和具有不同列名的数据框,但它们引用相同的东西。例如。

  1. 我的数据库汽车有车ID,名称和价格。

  2. 我的数据框 df 具有汽车标识,值和名称。

  3. 附加:我还想添加一个额外的日期'数据库中 df 中没有的列,并根据当前日期插入。

    我想将df保存在数据库中,以便Id = IdentityPrice = ValueName = Namedate = 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)})
    

1 个答案:

答案 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)