2014-05-10 71 views
10

Câu hỏi của tôi về cơ bản là trái ngược với cái này:Pandas chuyển đổi Dataframe để lồng Json

Create a Pandas DataFrame from deeply nested JSON

Tôi tự hỏi nếu nó có thể làm điều ngược lại. Cho một bảng như:

 Library Level   School Major 2013 Total 
200 MS_AVERY UGRAD GENERAL STUDIES GEST  5079 
201 MS_AVERY UGRAD GENERAL STUDIES HIST   5 
202 MS_AVERY UGRAD GENERAL STUDIES MELC   2 
203 MS_AVERY UGRAD GENERAL STUDIES PHIL   10 
204 MS_AVERY UGRAD GENERAL STUDIES PHYS   1 
205 MS_AVERY UGRAD GENERAL STUDIES POLS   53 

Có thể tạo ra một dict lồng nhau (hoặc JSON) như:

dict:

{'MS_AVERY': 
    { 'UGRAD' : 
     {'GENERAL STUDIES' : {'GEST' : 5} 
          {'MELC' : 2} 

... 
+0

có thể trùng lặp của [Tạo từ điển lồng nhau phức tạp từ Pandas DataFrame] (http://stackoverflow.com/questions/41283161/creating -complex-lồng nhau-từ điển-từ-pandas-dataframe) – Celebrian

Trả lời

5

Có vẻ như không khó để tạo ra một chức năng sẽ xây dựng từ điển đệ quy cho đối tượng DataFrame của bạn:

def fdrec(df): 
    drec = dict() 
    ncols = df.values.shape[1] 
    for line in df.values: 
     d = drec 
     for j, col in enumerate(line[:-1]): 
      if not col in d.keys(): 
       if j != ncols-2: 
        d[col] = {} 
        d = d[col] 
       else: 
        d[col] = line[-1] 
      else: 
       if j!= ncols-2: 
        d = d[col] 
    return drec 

sẽ sản xuất:

{'MS_AVERY': 
    {'UGRAD': 
     {'GENERAL STUDIES': {'PHYS': 1L, 
          'POLS': 53L, 
          'PHIL': 10L, 
          'HIST': 5L, 
          'MELC': 2L, 
          'GEST': 5079L}}}} 
+2

thankyou cho saullo phản hồi. Tôi đã tự hỏi nếu có một chức năng được xây dựng trong đó sẽ làm điều này, nhưng điều này hoạt động tuyệt vời! –

+0

Đây là một chức năng đáng yêu, nhưng đối với JSON phải có dấu ngoặc kép xung quanh tất cả các giá trị. –

0

Dưới đây là một giải pháp tôi đã đưa ra khi làm việc trên this question:

def rollup_to_dict_core(x, values, columns, d_columns=None): 
    if d_columns is None: 
     d_columns = [] 

    if len(columns) == 1: 
     if len(values) == 1: 
      return x.set_index(columns)[values[0]].to_dict() 
     else: 
      return x.set_index(columns)[values].to_dict(orient='index') 
    else: 
     res = x.groupby([columns[0]] + d_columns).apply(lambda y: rollup_to_dict_core(y, values, columns[1:])) 
     if len(d_columns) == 0: 
      return res.to_dict() 
     else: 
      res.name = columns[1] 
      res = res.reset_index(level=range(1, len(d_columns) + 1)) 
      return res.to_dict(orient='index') 

def rollup_to_dict(x, values, d_columns=None): 
    if d_columns is None: 
     d_columns = [] 

    columns = [c for c in x.columns if c not in values and c not in d_columns] 
    return rollup_to_dict_core(x, values, columns, d_columns) 

>>> pprint(rollup_to_dict(df, ['2013 Total'])) 
{'MS_AVERY': {'UGRAD': {'GENERAL STUDIES': {'GEST': 5079, 
              'HIST': 5, 
              'MELC': 2, 
              'PHIL': 10, 
              'PHYS': 1, 
              'POLS': 53}}}} 
Các vấn đề liên quan