Как я могу импортировать csv-файл с многосимвольными разделителями в фрейм данных в Python? - PullRequest
0 голосов
/ 31 января 2020

У меня есть этот movies.csv csv-файл , который я должен импортировать в фрейм данных с именем 'movies'. Но у меня есть некоторые проблемы со стиранием этих #, ##, ###, #### разделителей. введите описание изображения здесь Я попробовал этот код:

    import pandas as pd
my_cols=["Title", "US Gross", "Worldwide Gross", "Production Budget", "Release Date", "Distributor", "Source", "Major Genre", "Creative Type","Director","Rotten Tomatoes","Rating","IMDB Rating","IMDB Votes"]
movies=pd.read_csv('movies.csv', 
                   sep="\#\#\#\#",
                   quotechar='"',
                   names=my_cols,
                   engine="python")
movies

, но он все еще оставляет этот знак "#" и составляет только 1 столбец. Пожалуйста, помогите исправить это.

Вот несколько строк из CSV: Название # Валовой сбор США # Мировой валовой продукт # Бюджет производства # Дата выпуска # Дистрибьютор # Источник # Основной жанр # Тип объявления # Режиссер # Рейтинг гнилых томатов #IMDB The Land Girls # 146083 # "146083" # "8000000" # 12.6.1998 # Gramercy #### "" ## 6,1 # 1071

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Первое, что я заметил, это то, что ваш 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 .

0 голосов
/ 31 января 2020

Вы можете указать регулярное выражение в параметре sep, чтобы указать, что вы хотите использовать только символ # в качестве разделения, например:

my_cols=["Title", "US Gross", "Worldwide Gross", "Production Budget", "Release Date", "Distributor", "Source", "Major Genre", "Creative Type","Director","Rotten Tomatoes","Rating","IMDB Rating","IMDB Votes"]
movies=pd.read_csv('Downloads/movies.csv', 
                   sep="#{1}",
                   quotechar='"',
                   names=my_cols,
                   engine="python",
                   skiprows=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...