2013-08-21 39 views
14

Tôi nghĩ mình hiểu sai ý định của read_csv. Nếu tôi có tệp 'j' nhưpandas.read_csv: cách bỏ qua các dòng chú thích

# notes 
a,b,c 
# more notes 
1,2,3 

Làm cách nào để có thể pandas.read_csv tệp này, bỏ qua bất kỳ dòng '#' nào đã nhận xét? Tôi thấy trong 'bình luận' trợ giúp của các dòng không được hỗ trợ nhưng nó chỉ ra một dòng trống sẽ được trả về. Tôi thấy lỗi

df = pandas.read_csv('j', comment='#') 

CParserError: Lỗi mã hóa dữ liệu. C lỗi: Dự kiến ​​1 trường trong dòng 2, thấy 3

Tôi hiện đang trên

In [15]: pandas.__version__ 
Out[15]: '0.12.0rc1' 

On version'0.12.0-199-g4c8ad82' :

In [43]: df = pandas.read_csv('j', comment='#', header=None) 

CParserError: Lỗi mã hóa dữ liệu. C lỗi: Dự kiến ​​1 trường trong dòng 2, thấy 3

+0

' 'j'' là gì? Tôi không thể tạo lại lỗi khi thay thế '' j'' bằng đường dẫn tệp csv. – Bryan

+2

Bạn đã thử 'df = pandas.read_csv ('j', bình luận = '#')' – TheoretiCAL

+0

Xin lỗi, b '#' là lỗi đánh máy. 'j' là một tệp mẫu. Đó là một lỗi như Andy Hayden đề cập dưới đây. – mathtick

Trả lời

12

Vì vậy, tôi tin rằng trong các phiên bản mới nhất của gấu trúc (phiên bản 0.16.0), bạn có thể ném vào Tham số comment='#' vào pd.read_csv và điều này sẽ bỏ qua các nhận xét ngoài dòng.

Những vấn đề github cho thấy rằng bạn có thể làm điều này:

Xem tài liệu trên read_csv: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

8

Một workaround là để xác định skiprows để bỏ qua vài mục đầu tiên:

In [11]: s = '# notes\na,b,c\n# more notes\n1,2,3' 

In [12]: pd.read_csv(StringIO(s), sep=',', comment='#', skiprows=1) 
Out[12]: 
    a b c 
0 NaN NaN NaN 
1 1 2 3 

Nếu không read_csv được một chút nhầm lẫn:

In [13]: pd.read_csv(StringIO(s), sep=',', comment='#') 
Out[13]: 
     Unnamed: 0 
a b   c 
NaN NaN  NaN 
1 2   3 

Điều này có vẻ là trường hợp trong 0.12.0, tôi đã nộp a bug report.

Như Viktor chỉ ra bạn có thể sử dụng để loại bỏ các dropna NaN sau khi thực tế ... (có một recent open issue đã nhận xét dòng bị bỏ qua hoàn toàn):

In [14]: pd.read_csv(StringIO(s2), comment='#', sep=',').dropna(how='all') 
Out[14]: 
    a b c 
1 1 2 3 

Lưu ý: chỉ số mặc định sẽ "cho đi" thực tế có dữ liệu bị thiếu.

+1

Và cũng vì bạn không muốn các dòng chú thích chỉ cần gọi '.dropna (how = 'all'). Reset_index (drop = True)' sau. –

2

Tôi đang sử dụng phiên bản Pandas 0.13.1 và vấn đề này nhận xét-in-csv vẫn làm phiền tôi.

Dưới đây là cách giải quyết hiện tại của tôi:

def read_csv(filename, comment='#', sep=','): 
    lines = "".join([line for line in open(filename) 
        if not line.startswith(comment)]) 
    return pd.read_csv(StringIO(lines), sep=sep) 

Nếu không có pd.read_csv(filename, comment='#') tôi nhận được

pandas.parser.CParserError: Error tokenizing data. C error: Expected 1 fields in line 16, saw 3.

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