#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
aspdcol
, но используетеpd
inpd.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, большое спасибо за помощь и разъяснения.