2016-07-13 17 views
5

Tôi có tệp đầu vào có các cột đã biết hay không, giả sử hai cột NameSex. Đôi khi nó có dòng tiêu đề Name,Sex, và đôi khi nó không:Pandas read_csv mà không biết đầu trang có hiển thị

1.csv:

Name,Sex 
John,M 
Leslie,F 

2.csv:

John,M 
Leslie,F 

Biết danh tính của cột trước, có cách nào tốt đẹp để xử lý cả hai trường hợp với cùng một lệnh read_csv? Về cơ bản, tôi muốn chỉ định names=['Name', 'Sex'] và sau đó để nó suy ra header=0 chỉ khi tiêu đề ở đó. Tốt nhất mà tôi có thể đưa ra là:

  • 1) Đọc dòng đầu tiên của file trước khi làm read_csv, và thiết lập các thông số một cách thích hợp.

  • 2) Chỉ cần làm df = pd.read_csv(input_file, names=['Name', 'Sex']), sau đó kiểm tra xem hàng zeroeth là trùng với tiêu đề, và nếu nên thả nó (và sau đó có lẽ phải ghi số lại các hàng).

Nhưng điều này dường như không bình thường với trường hợp sử dụng đối với tôi. Có cách nào để làm điều này với read_csv mà tôi chưa từng nghĩ đến?

Trả lời

5

sử dụng tính năng mới - 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)])] 
) 

sử dụng .query() phương pháp:

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

tôi không chắc chắn rằng đây là cách thanh lịch nhất, nhưng điều này nên làm việc cũng như:

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

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

Cảm ơn tất cả các tùy chọn! Phiên bản cuối cùng vẫn trông sạch sẽ nhất với tôi, vì vậy tôi đoán tôi sẽ sử dụng phương pháp đó. Tôi sẽ để câu hỏi mở ngay bây giờ và chấp nhận trong một vài ngày nếu không có gì khác đi lên. – leekaiinthesky

Các vấn đề liên quan