2016-07-13 15 views
5

Mam plik wejściowy ze znanymi kolumnami, powiedzmy dwie kolumny Name i Sex. Czasami ma wiersz nagłówka Name,Sex, a czasami nie:Pandy read_csv nie wiedząc, czy nagłówek jest obecny

1.csv:

Name,Sex 
John,M 
Leslie,F 

2.csv:

John,M 
Leslie,F 

Znając tożsamość kolumny wcześniej, czy istnieje dobry sposób na obsługę obu przypadków za pomocą tego samego polecenia read_csv? Zasadniczo, chcę podać names=['Name', 'Sex'], a następnie mam to wnioskować header=0 tylko wtedy, gdy nagłówek tam jest. Najlepsze, co mogę wymyślić to:

  • 1) Przeczytaj pierwszy wiersz pliku przed wykonaniem read_csv i ustawić odpowiednio parametry .

  • 2) Wystarczy zrobić df = pd.read_csv(input_file, names=['Name', 'Sex']), następnie sprawdzić, czy zeroeth wiersz jest identyczny z nagłówkiem, a jeśli tak upuść go (i wtedy być może trzeba zmienić numerację wierszy).

Ale nie wydaje mi się to tak niezwykłe w przypadku użycia. Czy jest jakiś wbudowany sposób robienia tego z read_csv, o którym nie myślałem?

Odpowiedz

5

za pomocą nowej funkcji - 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)])] 
) 

użyciu .query() metody:

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

nie jestem pewien, że jest to najbardziej elegancki sposób, ale to powinno działać, a także:

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

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

Dzięki za wszystkie opcje! Ostatnia wersja wciąż wydaje mi się najczystsza, więc myślę, że wykorzystam to podejście. Pozostawię pytanie otwarte na razie i zaakceptuję za kilka dni, jeśli nic innego nie wyjdzie. – leekaiinthesky