Хотя в вопросе не указано engine
, давайте предположим, что это sqlite3
.
В следующем повторно запускаемом коде показано, что DataFrame.to_sql () создает таблицу sqlite3
и помещаетИндекс на это.Это данные из индекса фрейма данных.
Буквально принимая код вопроса, CSV должен импортировать в фрейм данных с RangeIndex
, который будет уникальным порядковым числом.В связи с этим следует удивляться, если количество строк в CSV-файле не совпадает с количеством строк, загруженных в таблицу sqlite3
.
Таким образом, есть две вещи, которые необходимо сделать: Убедитесь, что CSV-файлимпортируется правильно.Скорее всего, это проблема, поскольку плохо отформатированные CSV-файлы, созданные в электронных таблицах, управляемых человеком, часто приводят к сбою при манипулировании кодом по разным причинам.Но здесь невозможно ответить, потому что мы не знаем входных данных.
Однако то, что делает DataFrame.to_sql()
, следует исключить.И для этого можно передать method
. Его можно использовать для просмотра того, что DataFrame.to_sql()
делает с данными DataFrame до его передачи в SQL engine
.
import csv
import pandas as pd
import sqlite3
def dump_foo(conn):
cur = conn.cursor()
cur.execute("SELECT * FROM foo")
rows = cur.fetchall()
for row in rows:
print(row)
conn = sqlite3.connect('example145.db')
csv_data = """1,01-01-2019,724
2,01-01-2019,233,436
3,01-01-2019,345
4,01-01-2019,803,933,943,923,954
4,01-01-2019,803,933,943,923,954
4,01-01-2019,803,933,943,923,954
4,01-01-2019,803,933,943,923,954
4,01-01-2019,803,933,943,923,954
5,01-01-2019,454
5,01-01-2019,454
5,01-01-2019,454
5,01-01-2019,454
5,01-01-2019,454"""
with open('test145.csv', 'w') as f:
f.write(csv_data)
with open('test145.csv') as csvfile:
data = [row for row in csv.reader(csvfile)]
df = pd.DataFrame(data = data)
def checkit(table, conn, keys, data_iter):
print "What pandas wants to put into sqlite3"
for row in data_iter:
print(row)
# note, if_exists replaces the table and does not affect the data
df.to_sql('foo', conn, if_exists="replace", method=checkit)
df.to_sql('foo', conn, if_exists="replace")
print "*** What went into sqlite3"
dump_foo(conn)