Импорт панд не вставляет все строки - PullRequest
0 голосов
/ 13 марта 2019

Я импортирую файл .csv с 3300 строками данных через:

myCSVfile = pd.read_csv(csv_file)
myCSVfile.to_sql(con=engine, name='foo', if_exists='replace')

После успешного импорта я выполняю запрос «select * from ...» в моей таблице, который возвращает 3100 строк, так где же недостающие 200 строк?

Я предполагаю, что есть поврежденные данные, которые не могут быть прочитаны, и которые, как я предполагаю, затем пропускаются пандами. Однако нет никакого предупреждения, журнала или сообщения, чтобы явно сказать это. Сценарий выполняется как обычно.

Кто-нибудь испытывал подобные проблемы, или я упускаю что-то совершенно очевидное?

1 Ответ

1 голос
/ 13 марта 2019

Хотя в вопросе не указано 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)
...