2016-07-13 4 views
5

알려진 열이있는 입력 파일이 있습니다. 두 개의 열 NameSex이 있다고합시다. 때로는 헤더 행 Name,Sex을 가지고, 때로는 그렇지 않습니다 :헤더가 있는지 여부를 모른 채 Pandas read_csv

1.csv :

Name,Sex 
John,M 
Leslie,F 

2.csv :

John,M 
Leslie,F 

가의 신원을 알고 열을 미리 입력하면 동일한 read_csv 명령을 사용하여 두 경우를 모두 처리 할 수있는 좋은 방법이 있습니까? 기본적으로 names=['Name', 'Sex']을 지정하고 헤더가있을 때만 header=0을 유추해야합니다.

  • 1) read_csv를 수행하기 전에 파일의 첫 번째 줄을 읽고 적절하게 매개 변수를 설정 : 내가 가지고 올 수 제일이다.

  • 2) 그냥 는 제로 번째 행이 헤더에 동일한 지 여부를 확인하고 경우) 그래서 그것을 (드롭 어쩌면 행 번호를 다시 지정해야 df = pd.read_csv(input_file, names=['Name', 'Sex']) 않습니다.

그러나 이것은 유스 케이스가 이상하지 않은 것처럼 보입니다. 내가 생각하지 못했던 read_csv으로 이것을 수행하는 내장 된 방법이 있습니까? 새로운 기능을 사용하여

답변

5

-selection by callable은 :

cols = ['Name','Sex'] 

df = (pd.read_csv(filename, header=None, names=cols) 
     [lambda x: np.ones(len(x)).astype(bool) 
       if (x.iloc[0] != cols).all() 
       else np.concatenate([[False], np.ones(len(x)-1).astype(bool)])] 
) 

.query() 방법 사용 :

df = (pd.read_csv(filename, header=None, names=cols) 
     .query('Name != "Name" and Sex != "Sex"')) 

난이 가장 우아한 방법입니다 모르겠어요,하지만이 잘 작동해야합니다

df = pd.read_csv(filename, header=None, names=cols) 

if (df.iloc[0] == cols).all(): 
    df = df[1:].reset_index(drop=True) 
+1

모든 옵션을 제공해 주셔서 감사합니다. 마지막 버전은 여전히 ​​나에게 가장 깨끗해 보입니다. 그래서 나는이 방법을 사용할 것입니다. 지금 질문을 공개하고 아무 것도 나오지 않으면 며칠 안에 동의 할 것입니다. – leekaiinthesky

관련 문제