首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫组队分层次

熊猫组队分层次
EN

Stack Overflow用户
提问于 2016-02-15 16:00:15
回答 3查看 175关注 0票数 3

假设我有表单的数据:

代码语言:javascript
复制
>>> 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_前缀。

代码语言:javascript
复制
       branch      branch  employee_id
         year        name
0        2012           A            1
1        2012           B            2
2        2011           A            3
3        2011           B            2

最终目标是创建表单的字典列表:

代码语言:javascript
复制
[
    {
      "employeed_id": 1,
      "branch": {
                  "name": "A",
                  "year": "2012"
      }
    },
    {...}
]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-15 22:20:03

您可以对每一行应用一个函数,并将结果转换为列表:

代码语言:javascript
复制
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))

这保留了行的原始顺序:

代码语言:javascript
复制
[{'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}]

嵌套在具有下划线的列名上的编程方法:

代码语言:javascript
复制
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))

结果:

代码语言:javascript
复制
[{'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}}]
票数 1
EN

Stack Overflow用户

发布于 2016-02-15 16:27:49

不是很漂亮,但使用groupby就能得到你想要的东西

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-02-15 22:59:49

我的尝试是一种编程方式(假设您可以使用"_"):

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35413776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档