熊猫集团专栏进入水平

时间:2016-02-15 16:00:15

标签: python pandas

假设我有一个表格的数据框:

>>> 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"
      }
    },
    {...}
]

3 个答案:

答案 0 :(得分:1)

不漂亮,但使用Origin and Host headers for same domain requests得到了你想要的东西:

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}]

答案 1 :(得分: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}}]

答案 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))
相关问题