python嵌套字典的建立_python – 从Pandas DataFrame创建复杂的嵌套字典

不是很简洁,但它是我现在能得到的最好的:

>>> def rollup1(x):

... return x.set_index('test')[['grade', 'pass']].to_dict(orient='index')

>>> def rollup2(x):

... return x.groupby('course').apply(rollup1).to_dict()

>>> def rollup3(x):

... return x.groupby('study').apply(rollup2).to_dict()

>>> df = dat.groupby(['name','age','gender']).apply(rollup3)

>>> df.name = 'study'

>>> res = df.reset_index(level=[1,2]).to_dict(orient='index')

>>> pprint.pprint(res)

{'Henry': {'age': 31L,

'gender': 'Male',

'study': {'Physics': {'Quantum mechanics': {'Exam1': {'grade': 'C',

'pass': True},

'Exam2': {'grade': 'C',

'pass': True}}}}},

'John': {'age': 24L,

'gender': 'Male',

'study': {'Mathematics': {'Calculus 101': {'Essay': {'grade': 'A',

'pass': True},

'Exam': {'grade': 'A',

'pass': True}},

'Calculus 102': {'Exam': {'grade': 'B',

'pass': True}}},

'Philosophy': {'Aristotelean Ethics': {'Essay': {'grade': 'A',

'pass': True}}}}}}

我们的想法是将数据汇总到字典,同时将数据分组以获得“研究”专栏

更新

我试图创建更通用的解决方案,所以它也适用于像this one这样的问题:

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(dat, ['pass', 'grade'], ['age','gender']))

{'Henry': {'age': 31L,

'gender': 'Male',

'study': {'Physics': {'Quantum mechanics': {'Exam1': {'grade': 'C',

'pass': True},

'Exam2': {'grade': 'C',

'pass': True}}}}},

'John': {'age': 24L,

'gender': 'Male',

'study': {'Mathematics': {'Calculus 101': {'Essay': {'grade': 'A',

'pass': True},

'Exam': {'grade': 'A',

'pass': True}},

'Calculus 102': {'Exam': {'grade': 'B',

'pass': True}}},

'Philosophy': {'Aristotelean Ethics': {'Essay': {'grade': 'A',

'pass': True}}}}}}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值