2016-07-13 19 views
5

Bilinen sütunları olan bir giriş dosyası var, iki sütun Name ve Sex diyelim. Bazen başlık satırı Name,Sex vardır ve bazen olmaz:Pandalar read_csv üstbilgi mevcut olup olmadığını bilmeden

1.csv:

Name,Sex 
John,M 
Leslie,F 

2.csv:

John,M 
Leslie,F 

kimliğini bilerek Önceden sütunlar, her iki durumda aynı read_csv komutuyla işlemek için iyi bir yol var mı? Temel olarak, names=['Name', 'Sex'] belirtmek istiyorum ve daha sonra sadece başlık orada olduğunda header=0 var.

  • 1) read_csv yapmadan önce dosyanın ilk satırını okuyun ve uygun şekilde parametrelerini ayarlamak: Ben elde edebilirsiniz en iyisidir.

  • 2) Sadece sonra zeroeth satır başlığına özdeş olup olmadığını kontrol edin ve ise) bu yüzden (bırakın ve sonra belki satırları yeniden numaralandırmak zorunda df = pd.read_csv(input_file, names=['Name', 'Sex']) yapmak.

Ancak bu, benim için bir kullanım durumu olağandışı görünmüyor. Bunu düşünmediğim read_csv ile bunu yapmanın bir yolu var mı? yeni özelliği kullanarak

cevap

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() yöntemi kullanarak:

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

ben bu en zarif yolu olduğundan emin değilim, ama bu aynı zamanda çalışması gerekir:

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

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

Tüm seçenekler için teşekkürler! Son versiyon hala bana temiz görünüyor, bu yüzden bu yaklaşımı kullanacağımı tahmin ediyorum. Soruyu şimdilik açık bırakacağım ve başka hiçbir şey gelmezse birkaç gün içinde kabul edeceğim. – leekaiinthesky

İlgili konular