передача списка столбцов в качестве аргумента в pandas read_csv

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У нас есть пара больших .tsv файлов, и мы пытаемся извлечь из них данные. мы передаем список столбцов в качестве аргумента, однако получаем дубликат ValueError: Duplicate names are not allowed. .

Однако у нас не возникнет проблем, если мы передадим значения как names=['coming_from','article','referrer_type','n']

Вот мой код

 import datetime,json,pyodbc
import pandas as pd

class LoadData:
    def __init__(self,colname):
        self.colsname=colname

    def _read_file_extract_col_data_convert_data_into_json(self):
        _filepath_name = r"E:PythonScriptsPyCharmfilessourceclickstream-enwiki-2018-12.tsv"
        col_names='[' self.colsname ']'
        for chunk in (pd.read_csv(_filepath_name, delimiter="t", header=0,names=col_names, 
        chunksize=1,mangle_dupe_cols=True)):
        json_chunk = chunk.to_json(orient="records", force_ascii=True, default_handler=None)
        print(json_chunk)

list=[]
collist="'coming_from'","'article'","'referrer_type'","'n'"


p1=LoadData(','.join(collist))
p1._read_file_extract_col_data_convert_data_into_json()
  

Ошибка:

Трассировка (последний последний вызов): файл «E:/PythonScripts/PyCharm/PythonScripts_withPyCharm/DataIngestionScripts/File_To_JSON.py «, строка 54, в файле p1._read_file_extract_col_data_convert_data_into_json() «E:/PythonScripts/PyCharm/PythonScripts_withPyCharm/DataIngestionScripts/File_To_JSON.py «, строка 17, в _read_file_extract_col_data_convert_data_into_json для фрагмента в (pd.read_csv(_filepath_name, разделитель =»t», заголовок=0,имена= col_names, размер фрагмента=1,mangle_dupe_cols=True)): Файл «C:python_customize_install_locationlibsite-packagespandasioparsers.py «, строка 686, в read_csv возвращает _read(filepath_or_buffer, kwds) Файл «C:python_customize_install_locationlibsite-packagespandasioparsers.py «, строка 449, в _read _validate_names(kwds.get(«имена», Нет)) Файл «C:python_customize_install_locationlibsite-packagespandasioparsers.py «, строка 415, в _validate_names вызывает ошибку ValueError(«Повторяющиеся имена не допускаются.») Ошибка ValueError: повторяющиеся имена не допускаются.

Комментарии:

1. Знаете ли вы, что вы определили pandas as pdcol , но используете pd in pd.read_csv ?

2. это была опечатка, спасибо, что указали на это

3. col_names кажется, это строка, в то время как pandas ожидает список.

Ответ №1:

Первая проблема с вашим кодом заключается в том, как вы обрабатываете список имен столбцов. Изначально это одна строка. Даже после запуска col_names='[' self.colsname ']' это все еще одна строка (заключенная в квадратные скобки), тогда как это должен быть список имен столбцов.

Вторая проблема заключается в том, что когда вы вызываете read_csv с параметрами header=0 и names=… вместе, это означает, что:

  • строка 0 содержит имена столбцов,
  • но вы переопределяете их своими именами (списком).

Мой опыт показывает, что список столбцов, передаваемый здесь в names, должен иметь ту же длину, что и количество фактических столбцов данных, в противном случае могут возникнуть различные «побочные эффекты».

Я предлагаю изменить ваш код на что-то вроде приведенного ниже:

 class LoadData:
    def __init__(self, colnames):
        self.colnames = colnames

    def _read_file_extract_col_data_convert_data_into_json(self):
        _filepath_name = r"Input.tsv"
        i = 0
        for chunk in (pd.read_csv(_filepath_name, delimiter="t",
                header=0, names=self.colnames, chunksize=1)):
            print(f'chunk {i}:'); i  = 1
            print(chunk)
            json_chunk = chunk.to_json(orient="records")
            print(json_chunk)

collist = ['coming_from', 'article', 'referrer_type', 'n']
p1 = LoadData(collist)
p1._read_file_extract_col_data_convert_data_into_json()
  

Обратите внимание, что:

  • Я передал свое имя входного файла как _filepath_name . В вашей версии измените его на свое имя файла.
  • Я добавил некоторые дополнительные распечатки трассировки, удалите их в окончательной версии.
  • Передача mangle_dupe_cols здесь не имеет смысла, поскольку вы переопределяете существующий список столбцов новым списком без повторений.
  • Чтобы сохранить код кратким, при вызове to_json я удалил default_handler и force_ascii , поскольку их значения по умолчанию просто None и True .

Я подготовил свой входной файл (Input.tsv) как:

 aa  bb  cc  dd
a1  a2  a3  a4
b1  b2  b3  b4
c1  c2  c3  c4
  

Результат, который я получил, был:

 chunk 0:
  coming_from article referrer_type   n
0          a1      a2            a3  a4
[{"coming_from":"a1","article":"a2","referrer_type":"a3","n":"a4"}]
chunk 1:
  coming_from article referrer_type   n
1          b1      b2            b3  b4
[{"coming_from":"b1","article":"b2","referrer_type":"b3","n":"b4"}]
chunk 2:
  coming_from article referrer_type   n
2          c1      c2            c3  c4
[{"coming_from":"c1","article":"c2","referrer_type":"c3","n":"c4"}]
  

Другой причиной сбоя вашего кода может быть то, что во
входном файле больше столбцов, чем в списке имен.
В таком случае:

  • список, переданный в names, переопределяет только последний столбец,
  • но у начальных столбцов нет имени (они будут опущены в to_json .

Комментарии:

1. хммм, кажется, ты хорош в объясненных ответах, супер!

2. Valdi_Bo, большое спасибо за помощь и разъяснения.