[python] Python Pandas 데이터 토큰 화 오류
팬더를 사용하여 .csv 파일을 조작하려고 하는데이 오류가 발생합니다.
pandas.parser.CParserError : 데이터 토큰 화 오류. C 오류 : 3 행에 2 개의 필드가 있어야합니다.
팬더 문서를 읽으려고했지만 아무것도 찾지 못했습니다.
내 코드는 간단합니다.
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
이 문제를 어떻게 해결할 수 있습니까? csv
모듈이나 다른 언어를 사용해야 합니까?
Morningstar 에서 가져온 파일
답변
시도해 볼 수도 있습니다.
data = pd.read_csv('file1.csv', error_bad_lines=False)
이로 인해 문제가되는 줄을 건너 뛸 수 있습니다.
답변
문제 일 수 있습니다
- 데이터의 구분자
- @TomAugspurger가 지적한 것처럼 첫 번째 행
이 문제를 해결하려면를 호출 할 때 sep
및 / 또는 header
인수를 지정하십시오 read_csv
. 예를 들어
df = pandas.read_csv(fileName, sep='delimiter', header=None)
위의 코드에서 sep
구분자를 정의하고 header=None
팬더에게 소스 데이터에 헤더 / 열 제목에 대한 행이 없음을 알려줍니다. 따라서 문서를 말했다 : “파일에 헤더 행이 없으면 명시 적으로 header = None을 전달해야합니다.” 이 경우 팬더는 각 필드 {0,1,2, …}에 대해 정수 인덱스를 자동으로 만듭니다.
문서에 따르면 구분 기호 는 문제 가 되지 않아야합니다. 문서에 따르면 sep가 None [지정되지 않은 경우]이 자동으로 결정됩니다. 그러나 명확한 구분 기호가있는 인스턴스를 포함하여 이것으로 운이 없었습니다.
답변
파서가 파일 헤더에 혼동되고 있습니다. 첫 번째 행을 읽고 해당 행의 열 수를 유추합니다. 그러나 처음 두 행은 파일의 실제 데이터를 나타내지 않습니다.
함께 사용해보십시오 data = pd.read_csv(path, skiprows=2)
답변
CSV 파일에는 가변 개수의 열이있을 수 있으며 read_csv
처음 몇 행의 열 수를 유추했습니다. 이 경우 해결하는 두 가지 방법 :
1) 최대 열 수의 더미 첫 줄을 갖도록 CSV 파일을 변경하고을 지정 header=[0]
하십시오.
2) 또는 names = list(range(0,N))
N이 최대 열 수인 곳에서 사용 하십시오.
답변
csv CSV의 대부분은를 사용하여 생성 sep='/t'
되므로 구분 기호 를 read_csv
사용하여 탭 문자 (\t)
를 사용해보십시오 /t
. 따라서 다음 코드 줄을 사용하여 열어보십시오.
data=pd.read_csv("File_path", sep='\t')
답변
나는 또한이 문제가 있었지만 아마도 다른 이유가있을 수 있습니다. 팬더가 읽으려고하는 열을 추가하는 CSV에 후행 쉼표가 있습니다. 다음을 사용하면 작동하지만 잘못된 줄은 무시합니다.
data = pd.read_csv('file1.csv', error_bad_lines=False)
오류를 처리하기 위해 추한 종류의 해킹을 유지하려면 다음과 같은 작업을 수행하십시오.
line = []
expected = []
saw = []
cont = True
while cont == True:
try:
data = pd.read_csv('file1.csv',skiprows=line)
cont = False
except Exception as e:
errortype = e.message.split('.')[0].strip()
if errortype == 'Error tokenizing data':
cerror = e.message.split(':')[1].strip().replace(',','')
nums = [n for n in cerror.split(' ') if str.isdigit(n)]
expected.append(int(nums[0]))
saw.append(int(nums[2]))
line.append(int(nums[1])-1)
else:
cerror = 'Unknown'
print 'Unknown Error - 222'
if line != []:
# Handle the errors however you want
위 코드의 변수 ‘line’에 의해 잘못된 행이 제공되므로 행을 DataFrame에 다시 삽입하는 스크립트를 작성했습니다. 이것은 단순히 CSV 리더를 사용하여 피할 수 있습니다. 팬더 개발자가 앞으로 이러한 상황을보다 쉽게 처리 할 수 있기를 바랍니다.
답변
열 이름을 전달하지 않고 CSV로 읽으려고하는이 문제가있었습니다.
df = pd.read_csv(filename, header=None)
미리 목록에 열 이름을 지정한 다음에 전달하여 names
즉시 해결했습니다. 열 이름을 설정하지 않은 경우 데이터에있을 수있는 최대 열 수만큼 자리 표시 자 이름을 만들 수 있습니다.
col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)