2013-03-06 35 views
43

tôi có một tập hợp dữ liệu mà trông như thế này (ít nhất là 5 cột - nhưng có thể ít hơn)Xử lý Variable Số cột với Pandas - Python

1,2,3 
1,2,3,4 
1,2,3,4,5 
1,2 
1,2,3,4 
.... 

Tôi cố gắng để sử dụng gấu trúc read_table để đọc vào khung dữ liệu 5 cột. Tôi muốn đọc điều này mà không cần xoa bóp thêm.

Nếu tôi cố gắng

import pandas as pd 
my_cols=['A','B','C','D','E'] 
my_df=pd.read_table(path,sep=',',header=None,names=my_cols) 

tôi nhận được một lỗi - "tên cột có 5 lĩnh vực, dữ liệu có 3 lĩnh vực".

Có cách nào để làm cho gấu trúc điền vào NaN cho các cột bị thiếu trong khi đọc dữ liệu không?

Trả lời

50

Một cách mà dường như để làm việc (ít nhất là trong 0.10.1 và 0.11.0.dev-fc8de6d):

>>> !cat ragged.csv 
1,2,3 
1,2,3,4 
1,2,3,4,5 
1,2 
1,2,3,4 
>>> my_cols = ["A", "B", "C", "D", "E"] 
>>> pd.read_csv("ragged.csv", names=my_cols, engine='python') 
    A B C D E 
0 1 2 3 NaN NaN 
1 1 2 3 4 NaN 
2 1 2 3 4 5 
3 1 2 NaN NaN NaN 
4 1 2 3 4 NaN 

Lưu ý rằng phương pháp này đòi hỏi bạn phải cung cấp tên các cột bạn muốn, mặc dù. Không chung chung như một số cách khác, nhưng hoạt động tốt khi nó được áp dụng.

+2

Cảm ơn bạn! Điều này làm việc - động cơ = 'python' có vẻ là chìa khóa. Việc thêm thuộc tính này làm cho cả công việc read_table và read_csv đều hoạt động. –

+2

Điều này có vẻ khá xa với tôi. Thêm một vấn đề github: https://github.com/pydata/pandas/issues/2981 –

+9

Điều này hoạt động chính xác ngay bây giờ BTW mà không 'engine = 'python'' –

8

Tôi cũng muốn biết liệu điều này có khả thi hay không, từ tài liệu dường như không phải như vậy. Những gì bạn có thể có thể làm là đọc những dòng tập tin bằng cách dòng, và nối từng đọc một DataFrame:

import pandas as pd 

df = pd.DataFrame() 

with open(filepath, 'r') as f: 
    for line in f: 
     df = pd.concat([df, pd.DataFrame([tuple(line.strip().split(','))])], ignore_index=True) 

Nó hoạt động nhưng không phải theo cách thanh lịch nhất, tôi đoán ...

1

Ok. Bạn không chắc chắn hiệu quả như thế nào - nhưng đây là những gì tôi đã làm. Rất thích nghe nếu có một cách tốt hơn để làm điều này. Cảm ơn !

from pandas import DataFrame 

list_of_dicts=[] 
labels=['A','B','C','D','E'] 
for line in file: 
    line=line.rstrip('\n') 
    list_of_dicts.append(dict(zip(labels,line.split(',')))) 
frame=DataFrame(list_of_dicts) 
Các vấn đề liên quan