简体   繁体   English

将 pandas dataframe 转换为嵌套 json

[英]Converting pandas dataframe to nested json

I'm trying to convert a dataframe like this:我正在尝试像这样转换 dataframe :

df = pd.DataFrame({'A': ['1', '1', '2', '3'],
                   'B': ['1.1', '1.2', '2.1', '3.1'],
                   'C': ['1.1.1', '1.2.1', '2.1.2', '3.1.5'],
                   'Value': [25, 12, 15, 19],
                   'Period': ['2015', '2018', '2010', '2019']})  

Or或者

A   B   C   Value   Period
1   1.1 1.1.1   25  2015
1   1.2 1.2.1   12  2018
2   2.1 2.1.2   15  2010
3   3.1 3.1.5   19  2019

to a nested json output like:到嵌套的 json output 像:

{'A': [{'aCode': '1',
        'B': [{'bCode': '1.1',
           'C': [{'cCode': '1.1.1',
              'figures': [{'Value': 25, 'Period': '2015'}]}]}]},
        'B': [{'bCode': '1.2',
           'C': [{'cCode': '1.2.1',
              'figures': [{'Value': 12, 'Period': '2018'}]}]}]},
       {'aCode': '2',
        'B': [{'bCode': '2.1',
          'C': [{'cCode': '2.1.2',
            'figures': [{'Value': 15, 'Period': '2010'}]}]}]},
       {'aCode': '3',
        'B': [{'bCode': '3.1',
          'C': [{'cCode': '3.1.5',
            'figures': [{'Value': 19, 'Period': '2019'}]}]}]}]}

There are some vaguely relevant resources online but they are quite involved.网上有一些模糊相关的资源,但它们涉及的内容很多。 I wonder if there's a clean and clever way to achieve this.我想知道是否有一种干净而聪明的方法来实现这一目标。 Thanks in advance!提前致谢!

From your question, it sounds like you're having difficulty with the nesting part.从您的问题来看,听起来您在嵌套部分方面遇到了困难。 This should get you most of the way there:这应该让你大部分时间到达那里:

from collections import defaultdict

df = pd.DataFrame({'A': ['1', '1', '2', '3'],
                   'B': ['1.1', '1.2', '2.1', '3.1'],
                   'C': ['1.1.1', '1.2.1', '2.1.2', '3.1.5'],
                   'Value': [25, 12, 15, 19],
                   'Period': ['2015', '2018', '2010', '2019']})

tree = lambda: defaultdict(tree)

output = tree()
for row in df.itertuples():
    leaf = output[row.A][row.B][row.C]
    figures = leaf.get('figures', [])
    leaf['figures'] = [*figures, {'Value': row.Value, 'Period': row.Period}]

Which will produce:这将产生:

defaultdict(<function <lambda> at 0x12278ac20>, {
  '1': defaultdict(<function <lambda> at 0x12278ac20>, {
    '1.1': defaultdict(<function <lambda> at 0x12278ac20>, {
      '1.1.1': defaultdict(<function <lambda> at 0x12278ac20>, {
        'figures': [{'Period': '2015', 'Value': 25}],
      }),
    }),
    '1.2': defaultdict(<function <lambda> at 0x12278ac20>, {
      '1.2.1': defaultdict(<function <lambda> at 0x12278ac20>, {
        'figures': [{'Period': '2018', 'Value': 12}],
      }),
    }),
  }),
  '2': defaultdict(<function <lambda> at 0x12278ac20>, {
    '2.1': defaultdict(<function <lambda> at 0x12278ac20>, {
      '2.1.2': defaultdict(<function <lambda> at 0x12278ac20>, {
        'figures': [{'Period': '2010', 'Value': 15}],
      }),
    }),
  }),
  '3': defaultdict(<function <lambda> at 0x12278ac20>, {
    '3.1': defaultdict(<function <lambda> at 0x12278ac20>, {
      '3.1.5': defaultdict(<function <lambda> at 0x12278ac20>, {
        'figures': [{'Period': '2019', 'Value': 19}],
      }),
    }),
  }),
})

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM