2013-07-19 47 views
7

Tôi mới làm quen với gấu trúc và đó là câu hỏi đầu tiên của tôi về stackoverflow, tôi đang cố gắng thực hiện một số phân tích với gấu trúc.Tạo một chú gấu trúc DataFrame từ nhiều dicts

Tôi có một số tệp văn bản có bản ghi dữ liệu mà tôi muốn xử lý. Mỗi dòng của tệp phù hợp với bản ghi mà các trường ở một vị trí cố định và có độ dài của một số ký tự cố định. Có nhiều loại bản ghi khác nhau trên cùng một tệp, tất cả các bản ghi chia sẻ trường đầu tiên có hai ký tự tùy thuộc vào loại bản ghi. Như một ví dụ:

Some file: 
01Jhon  Smith  555-1234           
03Cow   Bos primigenius taurus  00401     
01Jannette Jhonson   00100000000        
... 


field start length 
type   1  2 *common to all records, example: 01 = person, 03 = animal 
name   3  10 
surname  13  10 
phone  23  8 
credit  31  11 
fill of spaces 

Tôi đang viết một số mã để chuyển đổi một bản ghi vào một từ điển:

person1 = {'type': 01, 'name': = 'Jhon', 'surname': = 'Smith', 'phone': '555-1234'} 
person2 = {'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00} 
animal1 = {'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 } 

Nếu một lĩnh vực là rỗng (đầy khoảng trống) sẽ không có trong từ điển) .

Với tất cả các bản ghi của một loại tôi muốn tạo một khung dữ liệu DataFrame với các phím dicts làm tên cột, tôi đã thử với pandas.DataFrame.from_dict() mà không thành công.

Và đây là câu hỏi của tôi: Có cách nào để làm điều này với gấu trúc để các phím dict trở thành tên cột? Có phương pháp nào khác để xử lý loại tệp này không?

Trả lời

7

Để thực hiện một DataFrame từ một cuốn từ điển, bạn có thể vượt qua một danh sách của các từ điển:

>>> person1 = {'type': 01, 'name': 'Jhon', 'surname': 'Smith', 'phone': '555-1234'} 
>>> person2 = {'type': 01, 'name': 'Jannette', 'surname': 'Jhonson', 'credit': 1000000.00} 
>>> animal1 = {'type': 03, 'cname': 'cow', 'sciname': 'Bos....', 'legs': 4, 'tails': 1 } 
>>> pd.DataFrame([person1]) 
    name  phone surname type 
0 Jhon 555-1234 Smith  1 
>>> pd.DataFrame([person1, person2]) 
    credit  name  phone surname type 
0  NaN  Jhon 555-1234 Smith  1 
1 1000000 Jannette  NaN Jhonson  1 
>>> pd.DataFrame.from_dict([person1, person2]) 
    credit  name  phone surname type 
0  NaN  Jhon 555-1234 Smith  1 
1 1000000 Jannette  NaN Jhonson  1 

Đối với các vấn đề cơ bản hơn của hai tập tin khác nhau định dạng trộn lẫn, và giả sử các tập tin không quá lớn mà chúng ta không thể đọc chúng và lưu trữ chúng trong bộ nhớ, tôi muốn sử dụng StringIO để tạo một đối tượng giống như một tệp nhưng chỉ có các dòng chúng ta muốn và sau đó sử dụng read_fwf (tệp chiều rộng cố định) . Ví dụ:

from StringIO import StringIO 

def get_filelike_object(filename, line_prefix): 
    s = StringIO() 
    with open(filename, "r") as fp: 
     for line in fp: 
      if line.startswith(line_prefix): 
       s.write(line) 
    s.seek(0) 
    return s 

và sau đó

>>> type01 = get_filelike_object("animal.dat", "01") 
>>> df = pd.read_fwf(type01, names="type name surname phone credit".split(), 
        widths=[2, 10, 10, 8, 11], header=None) 
>>> df 
    type  name surname  phone  credit 
0  1  Jhon Smith 555-1234  NaN 
1  1 Jannette Jhonson  NaN 100000000 

nên làm việc. Tất nhiên bạn cũng có thể tách các tệp thành các loại khác nhau trước khi pandas từng thấy chúng, có thể dễ dàng nhất.

+0

Xin cảm ơn, _list of_ dicts là chìa khóa. Các tập tin là hàng trăm Mbs gzip nén và một số Gbs uncompresed, do đó, sẽ đọc từng dòng và nối thêm vào DataFrame tương ứng. – tinproject

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