[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)