2016-02-15 160 views
3

等級假設我有以下形式的數據幀:熊貓集團列到

>>> df = pd.DataFrame([['2012', 'A', 1], ['2012', 'B', 2], ['2011', 'A', 3], 
         ['2011', 'B', 2]], 
         columns=['branch_year', 'branch_name', 'employee_id']) 

    branch_year branch_name employee_id 
0  2012   A   1 
1  2012   B   2 
2  2011   A   3 
3  2011   B   2 

我怎樣才能結合列branch_yearbranch_name,讓他們有一個父列branch - 甚至是重新命名他們擺脫branch_前綴。

 branch  branch employee_id 
     year  name 
0  2012   A   1 
1  2012   B   2 
2  2011   A   3 
3  2011   B   2 

的最終目標是創建窗體的詞典列表:

[ 
    { 
     "employeed_id": 1, 
     "branch": { 
        "name": "A", 
        "year": "2012" 
     } 
    }, 
    {...} 
] 
+0

類似於:'df.columns.names = MultiIndex.from_tuples(original.split('_')for original in df.columns.names)'...但這可能不是很正確,原因很多。 –

+0

更正:您不需要'columns'上的'.names'位,並且您需要將序列作爲列表傳遞。另外,雖然它不完全符合你的要求,但你試過'to_json(orient ='records')'?也許你可以創建一個問題(或拉請求)用於生成具有'MultiIndex'數據的嵌套字典的json。 –

回答

1

您可以申請一個函數將每一行結果轉換成一個列表:

def to_nested_dict(row): 
    return {'employee_id': row.employee_id, 
      'branch': {'year': row.branch_year, 'name': row.branch_name}} 

list(df.apply(to_nested_dict, axis=1)) 

這將保留該行的原始順序:

[{'branch': {'name': 'A', 'year': '2012'}, 'employee_id': 1}, 
{'branch': {'name': 'B', 'year': '2012'}, 'employee_id': 2}, 
{'branch': {'name': 'A', 'year': '2011'}, 'employee_id': 3}, 
{'branch': {'name': 'B', 'year': '2011'}, 'employee_id': 2}] 

嵌套在有下劃線的列名編程方法:

def to_nested_dict(row): 
    res = {} 
    for col in row.index: 
     outer_key, inner_key = col.split('_') 
     outer = res.setdefault(outer_key, {}) 
     outer[inner_key] = row[col] 
    return res 

list(df.apply(to_nested_dict, axis=1)) 

結果:

[{'branch': {'name': 'A', 'year': '2012'}, 'employee': {'id': 1}}, 
{'branch': {'name': 'B', 'year': '2012'}, 'employee': {'id': 2}}, 
{'branch': {'name': 'A', 'year': '2011'}, 'employee': {'id': 3}}, 
{'branch': {'name': 'B', 'year': '2011'}, 'employee': {'id': 2}}] 
+0

有沒有一種簡單的方法可以通過編程來嵌套具有下劃線的列名?例如。 '{'branch':{'name':'A','year':'2012'},'employee':{'id':1}}' – ksindi

+1

添加了一個版本。 –

1

不漂亮,但它可以讓你想用groupby什麼:

lst = [] 
for k,g in pd.groupby(df, by=['branch_name','branch_year']): 
    d = {'employee_id': int(g['employee_id']), 'branch': {'name': k[0], 'year': k[1]}} 
    lst.append(d) 

lst 
[{'branch': {'name': 'A', 'year': '2011'}, 'employee_id': 3}, 
{'branch': {'name': 'A', 'year': '2012'}, 'employee_id': 1}, 
{'branch': {'name': 'B', 'year': '2011'}, 'employee_id': 2}, 
{'branch': {'name': 'B', 'year': '2012'}, 'employee_id': 2}] 
0

我嘗試作爲一個綱領性(假設你可以通過「_」分割):

hierarchy = [original.split('_') for original in df.columns] 

def to_nested_dict(row): 
    d = defaultdict(dict) 
    for keys, field in zip(hierarchy, row.index): 
     val = getattr(row, field) 
     if len(keys) == 1: 
      d[keys[0]] = val 
     elif len(a) == 2: 
      d[keys[0]][keys[1]] = val 
    return d 


list(df.apply(to_nested_dict, axis=1))