2016-08-21 21 views
5

Tôi có một khung dữ liệu với một MultiIndex. Tôi tự hỏi liệu tôi đã tạo khung dữ liệu theo cách chính xác chưa (xem bên dưới).DataFrame với MultiIndex để dict

   01.01 02.01 03.01 04.01 
bar total1  40  52  18  11 
    total2  36  85  5  92 
baz total1  23  39  45  70 
    total2  50  49  51  65 
foo total1  23  97  17  97 
    total2  64  56  94  45 
qux total1  13  73  38  4 
    total2  80  8  61  50 

df.index.values kết quả trong:

array([('bar', 'total1'), ('bar', 'total2'), ('baz', 'total1'), 
     ('baz', 'total2'), ('foo', 'total1'), ('foo', 'total2'), 
     ('qux', 'total1'), ('qux', 'total2')], dtype=object) 

df.index.get_level_values kết quả trong:

<bound method MultiIndex.get_level_values of MultiIndex(levels=[[u'bar', u'baz', u'foo', u'qux'], [u'total1', u'total2']], 
      labels=[[0, 0, 1, 1, 2, 2, 3, 3], [0, 1, 0, 1, 0, 1, 0, 1]],names=[] 

Tôi cuối cùng tìm cách để chuyển đổi df vào một dict của bộ từ điển như vậy mà chính dict đầu tiên là một của ['bar', 'baz', 'foo', 'qux'] và các giá trị là các ngày và từ điển bên trong được tạo thành từ 'total1' và 'totals2' làm khóa và các giá trị là số nguyên của df. giải thích Alternative, là ví dụ nếu dict1 là dict sau đó gọi:

dict1['bar'] 

sẽ cho kết quả đầu ra:

{u'bar':{'01.01':{'total1':40,'total2':36},'02.01':{'total1':52,'total2':85},'03.01':{'total1':18,'total2':5},'04.01':{'total1':11,'total2':92} } } 

Làm thế nào và những gì tôi sẽ cần phải thay đổi để đạt được điều này? Đây có phải là vấn đề lập chỉ mục không? Tôi tương đối mới với gấu trúc và từ điển vì vậy tôi hy vọng bạn có thể trần với tôi.

+0

Bạn hãy thử 'df.to_dict() '? – albert

+0

@albert yes và 'df.to_dict()' kết quả bằng: '{'01 .01 ': {(' bar ',' total1 '): 40, (' bar ',' total2 '): 36, (' baz ') , 'total1'): 23, ('baz', 'total2'): 50, 'etc ..' df.to_dict ('index') 'kết quả bằng:' ('bar', 'total1'): {' 01.08 ': 40, '02 .08': 52, '03 .08 ': 18, '04 .08': 11}, ('bar', 'total2'): {'01 .08 ': 36, '02 .08': 85, '03 .08 ' : 5, '04 .08 ': 92} '. Vì vậy, nó được tôi gần nơi tôi muốn, đó là lý do tại sao tôi nghĩ rằng nó có thể là một vấn đề với sự hình thành của các khung dữ liệu. – OAK

+0

Bạn có thể xem xét các tùy chọn/tham số được hỗ trợ cho 'df.to_csv()' vì chúng cho phép bạn thao tác theo cách dữ liệu được chuyển đổi: http://pandas.pydata.org/pandas-docs/stable/generated/ pandas.DataFrame.to_dict.html Tôi đề nghị 'df.to_csv ('index')' nhưng không thử nó. – albert

Trả lời

5

Để chuyển đổi toàn bộ dataframe vào từ điển Hãy thử:

df.groupby(level=0).apply(lambda df: df.xs(df.name).to_dict()).to_dict() 

{'bar': {'01.01': {'total1': 40, 'total2': 36}, 
    '02.01': {'total1': 52, 'total2': 85}, 
    '03.01': {'total1': 18, 'total2': 5}, 
    '04.01': {'total1': 11, 'total2': 92}}, 
'baz': {'01.01': {'total1': 23, 'total2': 50}, 
    '02.01': {'total1': 39, 'total2': 49}, 
    '03.01': {'total1': 45, 'total2': 51}, 
    '04.01': {'total1': 70, 'total2': 65}}, 
'foo': {'01.01': {'total1': 23, 'total2': 64}, 
    '02.01': {'total1': 97, 'total2': 56}, 
    '03.01': {'total1': 17, 'total2': 94}, 
    '04.01': {'total1': 97, 'total2': 45}}, 
'qux': {'01.01': {'total1': 13, 'total2': 80}, 
    '02.01': {'total1': 73, 'total2': 8}, 
    '03.01': {'total1': 38, 'total2': 61}, 
    '04.01': {'total1': 4, 'total2': 50}}} 

Để chuyển đổi một cột cụ thể, chọn trước khi chuyển đổi nó vào từ điển tức là

df.groupby(level=0).apply(lambda df: df.xs(df.name)[colname].to_dict()).to_dict() 
+0

@piRSquard sẽ cố gắng cảm ơn – OAK

+0

Câu trả lời tuyệt vời thưa ngài. – Dark

+0

@jezrael là một câu trả lời tuyệt vời của nó rồi. Cảm thấy như hoàn thành nó cho độc giả trong tương lai. – Dark

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