Первое, что я заметил, это то, что ваш CSV-файл содержит single # в качестве разделителя.
Правда, иногда он содержит несколько хешей в последовательность, но это означает только то, что количество полей ввода отсутствует (это пустые строки). Вот почему хэши, расположенные по принципу между последовательными полями, фактически находятся в вашем файле рядом друг с другом.
Еще одна вещь, на которую следует обратить внимание, это то, что поведение по умолчанию read_csv что такие пустые строки преобразуются в NaN , что не является лучшим выбором для пропуска, например, строк.
Чтобы отключить эту функцию, передайте na_filter = False .
Также обратите внимание, что quotechar не требуется, поскольку вы передали только его значение по умолчанию.
параметр engine , вероятно, также не требуется.
Следующее замечание, касающееся имен столбцов, заключается в том, что первая строка вашего входного файла (имена столбцов) содержит ao Рейтинг гнилых томатов ( один столбец), где находится список столбцов. содержит два столбца: Гнилые помидоры и Рейтинг , которых нет в ваших входных данных.
Итак, отбросьте Имена аргумент (вы на самом деле пытаетесь прочитать все столбцы).
Еще одна тонкая деталь: если вы передали names параметр, это означает, что:
- Ваш ввод не содержит any строка с именами столбцов.
- Вы сами указываете их.
- Строки данных читаются, начиная с первой строки ввода.
Поскольку ваш файл содержит имена столбцов, они фактически читаются как первая строка данных .
Если вы хотите "ограничить" чтение подмножеством исходные столбцы, передайте usecols параметр со списком столбцов, но, как я вижу, он вам не нужен.
Итак, чтобы подвести итог, попробуйте следующий код:
movies = pd.read_csv('movies.csv', sep='#', na_filter=False)
Редактировать после комментария начиная с 11: 58: 03Z
Если «дополнительные» хеши только в первом поле (например, Revolution # 9 в строке 803), есть возможность справиться с этой проблемой.
Идея состоит в том, чтобы:
- Написать специализированный парсер, выполняя reverse s plit в каждой строке, читаемой из входного файла.
- Чтение имен столбцов (из первой входной строки) только с этим синтаксическим анализатором (таким образом, потребляя первую строку).
- Создание DataFrame вызов pd.DataFrame с:
- только для этого парсера как data (он будет читать "дальнейшие" строки, т.е. строки, содержащие данные),
- список столбцов читается как столбцы .
Для этого определите синтаксический анализатор следующим образом:
def parse_file(fn, sep, maxsplit):
with open(fn) as f:
for line in f:
fields = line.strip().rsplit(sep, maxsplit)
yield [ tt.strip('"') for tt in fields ]
Затем вместо из read_csv , выполнить:
myParser = parse_file('input.csv', '#', 12)
cols = next(myParser)
df = pd.DataFrame(myParser, columns=cols)
Обратите внимание, что задача удаления двойных кавычек, окружающих некоторые поля, была реализована в анализаторе (см. tt.strip ('"') ).
Однако при чтении DataFrame все столбцы имеют тип string . Таким образом, вы должны привести определенные столбцы к их соответствующим типам. Например, все 3 «бюджетных» столбца можно преобразовать в int и Дата выпуска в datetime .