2014-09-19 5 views
2

팬더를 실험하면서 pandas.read_csv의 이상한 행동을 발견했으며 더 많은 경험을 가진 사람이 그 원인을 설명 할 수 있는지 궁금해했습니다. 꽤 잘열려있는 파일에서 Pandas read_csv()를 두 번 사용하기

import pandas as pd 

class dataMatrix: 
    def __init__(self, filepath): 
     self.path = filepath # File path to the target .csv file. 
     self.csvfile = open(filepath) # Open file. 
     self.csvdataframe = pd.read_csv(self.csvfile) 

자,이 작품 내 __ 주요 __.py의 클래스를 호출 :

여기 .csv 파일에서 새 pandas.dataframe을 만들기위한 나의 기본 클래스 정의는, 시작하려면

From dataMatrix.py import dataMatrix 

testObject = dataMatrix('/path/to/csv/file') 

을하지만이 과정이 자동으로 pandas.dataframe.columns 지수로 .CSV의 첫 번째 행을 설정하는 것을 알아 차리지되었다 성공적으로 팬더 dataframe을 만듭니다. 대신, 난 번호를 매기기로 결정했다. 필자는 이전에 열의 수를 알고 있다고 가정하고 싶지 않았기 때문에 파일을 열고 데이터 프레임에로드하고 열을 계산 한 다음 범위를 사용하여 적절한 수의 열을 사용하여 데이터 프레임을 다시로드하는 방식을 취했습니다 (). __ 주요 __.py에서 같은 내 처리를 유지

import pandas as pd 

class dataMatrix: 
    def __init__(self, filepath): 
     self.path = filepath 
     self.csvfile = open(filepath) 

     # Load the .csv file to count the columns. 
     self.csvdataframe = pd.read_csv(self.csvfile) 
     # Count the columns. 
     self.numcolumns = len(self.csvdataframe.columns) 
     # Re-load the .csv file, manually setting the column names to their 
     # number. 
     self.csvdataframe = pd.read_csv(self.csvfile, 
             names=range(self.numcolumns)) 

, 내가 다시 적절한 이름 (0 ~ 499)와 컬럼의 정확한 숫자 (이 경우 500)와 dataframe를 얻었으나, 그것은이었다 그렇지 않으면 빈 (행 데이터 없음). 내 머리를 긁적

, 나는 self.csvfile을 닫고과 같이 다시로드하기로 결정

import pandas as pd 

class dataMatrix: 
    def __init__(self, filepath): 
     self.path = filepath 
     self.csvfile = open(filepath) 

     # Load the .csv file to count the columns. 
     self.csvdataframe = pd.read_csv(self.csvfile) 
     # Count the columns. 
     self.numcolumns = len(self.csvdataframe.columns) 

     # Close the .csv file.   #<---- +++++++ 
     self.csvfile.close()   #<---- Added 
     # Re-open file.    #<---- Block 
     self.csvfile = open(filepath) #<---- +++++++ 

     # Re-load the .csv file, manually setting the column names to their 
     # number. 
     self.csvdataframe = pd.read_csv(self.csvfile, 
             names=range(self.numcolumns)) 

파일을 닫고 열 번호가 0으로는 pandas.dataframe 제대로 반환 개방을 다시 ... 499 및 모든 255 개의 후속 데이터 행.

내 질문에 왜 파일을 닫고 다시 열면 차이가 발생합니까? 당신이

open(filepath) 

파일 핸들 반복자을 가진 파일을 열 때

답변

4

가 반환됩니다. 반복기는 내용을 한 번 통과하는 데 적합합니다. 따라서

self.csvdataframe = pd.read_csv(self.csvfile) 

내용을 읽고 반복기를 모두 소모합니다. 이후에 pd.read_csv을 호출하면 반복기가 비어 있다고 생각합니다. 방금 pd.read_csv에 파일 경로를 전달하여이 문제를 피할 수

참고 :

class dataMatrix: 
    def __init__(self, filepath): 
     self.path = filepath 

     # Load the .csv file to count the columns. 
     self.csvdataframe = pd.read_csv(filepath) 
     # Count the columns. 
     self.numcolumns = len(self.csvdataframe.columns) 


     # Re-load the .csv file, manually setting the column names to their 
     # number. 
     self.csvdataframe = pd.read_csv(filepath, 
             names=range(self.numcolumns))  

pd.read_csv 것이다 당신을위한 파일을 연 다음 (닫습니다).

추신. 또 다른 옵션은 self.csvfile.seek(0)을 호출하여 파일 핸들을 파일의 시작 부분으로 재설정하는 것이지만 pd.read_csv(filepath, ...)을 사용하는 것이 더 쉽습니다.


더 나은, 대신 (비효율적 인)를 두 번 pd.read_csv를 호출,이 같은 열 이름을 바꿀 수 있습니다 :

class dataMatrix: 
    def __init__(self, filepath): 
     self.path = filepath 

     # Load the .csv file to count the columns. 
     self.csvdataframe = pd.read_csv(filepath) 
     self.numcolumns = len(self.csvdataframe.columns) 
     self.csvdataframe.columns = range(self.numcolumns) 
+0

감사 파일 반복자에 대한 정보를 원하시면. 그건 의미가 있습니다. 열린 파일 대신 'filepath'를 전달하도록 변경합니다.그러나 마지막에 제안한대로 열의 이름을 바꾸면 열 이름이 바뀌므로 첫 번째 데이터 행이 손실됩니다. –

+0

그런 다음'header = None'을 추가하여 데이터의 첫 번째 행이 열 이름으로 해석되지 않고 데이터의 일부가되도록합니다. – unutbu

+0

아 그래, header = None에 대해 잊어 버렸습니다 ... 작동하도록하는 데 문제가 있습니다.하지만 그것은 별개의 문제입니다. 내 원래의 질문에 답변 해 주셔서 감사합니다! 나는 'openfile'행동을 일으키는 낮은 수준의 "비하인드"상호 작용에 대해서만 궁금해했습니다. 감사! –

관련 문제