如何将嵌套字典转换为分级Pandas数据框架

mbskvtky  于 2022-11-20  发布在  其他
关注(0)|答案(3)|浏览(171)

如何将多于3层的N嵌套字典转换成层次化的 Dataframe ?

input_dict = {
                '.Stock': {
                            '.No[0]': '3241512)',
                            '.No[1]': '1111111111',
                            '.No[2]': '444444444444',
                            '.Version': '46',
                            '.Revision': '78'
                          },
                '.Time': '12.11.2022'
             }

我所期望:

import pandas as pd
expected_df = pd.DataFrame([{'level_0': '.Stock', 'level_1': '.No_0', "value": '3241512'},
 {'level_0': '.Stock', 'level_1': '.No_1', "value": '1111111111',},
 {'level_0': '.Stock', 'level_1': '.No_2', "value": '444444444444'},
 {'level_0': '.Stock', 'level_1': '.Version', "value": '46'},
 {'level_0': '.Stock', 'level_1': '.Revision', "value": '78'},
 {'level_0': '.Time',  "value": '12.11.2022'}])

| 索引|级别_0|级别_1|价值观|
| - -|- -|- -|- -|
| 第0页|.库存|第0个|小行星3241512|
| 一个|.库存|第1个|小行星11111111|
| 2个|.库存|第二个|小行星4444444444|
| 三个|.库存|.版本|四十六|
| 四个|.库存|二、修订|七十八|
| 五个|时间|不含N|二零二二年十一月十二日|
首先我需要把嵌套字典转换成层次字典列表,然后把层次字典列表转换成 Dataframe 。我该如何转换,请帮助我!
我已经尝试了下面的代码,但它并没有显示完全正确的结果。

pd.DataFrame(input_dict).unstack().to_frame().reset_index()
mgdq6dx1

mgdq6dx11#

您可以首先使用递归函数来展开嵌套字典(请参见“获取嵌套字典项的最佳方法”)。
第一个
然后,您需要填充缺少的级别,就像示例中的最后一行一样。您可以使用zip_longest来实现此目的,并将值粘贴到最后一个位置。

>>> from itertools import zip_longest
>>> d = list(zip(*zip_longest(*d.keys()), d.values()))
>>> d
[('.Stock', '.No[0]', '3241512)'),
 ('.Stock', '.No[1]', '1111111111'),
 ('.Stock', '.No[2]', '444444444444'),
 ('.Stock', '.Version', '46'),
 ('.Stock', '.Revision', '78'),
 ('.Time', None, '12.11.2022')]

现在您可以创建 Dataframe :

>>> pd.DataFrame(d)
    0   1   2
0   .Stock  .No[0]  3241512)
1   .Stock  .No[1]  1111111111
2   .Stock  .No[2]  444444444444
3   .Stock  .Version    46
4   .Stock  .Revision   78
5   .Time   None    12.11.2022
6l7fqoea

6l7fqoea2#

我找到了解决方案,感谢您的意见:(

def nesting_list_convert(in_dict,level=0):
    out_list = []
    for k1, v1 in in_dict.items():
        if isinstance(v1, dict):
            temp_list = nesting_list_convert(v1,level+1)
            for element in temp_list:
                temp_dict = {("level_"+str(level)) : k1}
                temp_dict.update(element)
                out_list.append(temp_dict)
        else:
             out_list.append({("level_"+str(level)) : k1,"value":v1})
return out_list

out_df = pd.DataFrame(nesting_list_convert(input_dict))
out_df = out_df.reindex(sorted(out_df.columns), axis=1)

| 索引|级别_0|级别_1|价值观|
| - -|- -|- -|- -|
| 第0页|.库存|.0号|小行星3241512|
| 一个|.库存|第1个|小行星11111111|
| 2个|.库存|第二个|小行星4444444444|
| 三个|.库存|.版本|四十六|
| 四个|.库存|二、修订|七十八|
| 五个|时间|不含N|二零二二年十一月十二日|
这解决了字典的6'嵌套级。

3qpi33ja

3qpi33ja3#

对于您的具体问题,基于this anser的解决方案应该有效:

data = {}
for k1, v1 in input_dict.items():
    if isinstance(v1, dict):
        for k2, v2 in v1.items():
            data[(k1, k2)] = v2
    else:
        data[(k1, pd.NA)] = v1

df = pd.Series(data).reset_index()

df:

level_0    level_1             0
0  .Stock     .No[0]      3241512)
1  .Stock     .No[1]    1111111111
2  .Stock     .No[2]  444444444444
3  .Stock   .Version            46
4  .Stock  .Revision            78
5   .Time        NaN    12.11.2022

对于具有更多级别的字典,您应该将循环 Package 为递归函数。

相关问题