首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套ordereddict json_normalize

嵌套ordereddict json_normalize
EN

Stack Overflow用户
提问于 2022-04-25 09:08:45
回答 1查看 101关注 0票数 0

我尝试使用json_normalize来转换嵌套的ordereddict。但是,对于嵌套的ordereddict,它只能定义标头,而将值设置为NaN。下面是有序dict的样本数据

代码语言:javascript
复制
data = [OrderedDict([('name', 'HTTP'),
              ('or',
               OrderedDict([('name', '1'),
                            ('ip-port-tcp',
                             ['10001',
                              '9001'])]))]),
 OrderedDict([('name', 'L3045_1'),
              ('and',
               OrderedDict([('name', '1'),
                            ('or',
                             [OrderedDict([('name', '1'),
                                           ('ip-address',
                                            ['123.3.208.1',
                                             '122.255.199.2'])]),
                              OrderedDict([('name', '2'),
                                           ('ip-port-tcp',
                                            ['443', '80'])])])]))]),
 OrderedDict([('name', 'L3045_2'),
              ('and',
               OrderedDict([('name', '1'),
                            ('ip-port-tcp', '443'),
                            ('or',
                             OrderedDict([('name', '1'),
                                          ('ip-address',
                                           ['121.98.27.10',
                                            '10.241.58.30'])]))]))])
]

我得到的输出如下

正如我们在上面所看到的,json_normalize可以将嵌套ordereddict中的头定义为and.or.xxx,但是,该值都存储在and.or中,在and.or中它应该在头和值之间对齐预期的输出。

EN

回答 1

Stack Overflow用户

发布于 2022-04-25 11:24:03

我不知道您的数据会有多复杂,我也不确定dataframe是表示防火墙规则的逻辑组合的最好方法。无论如何,对于这个特定的列,您可以首先对它进行explode以获得新的行,然后对已爆炸的列进行json_normalize,最后使用重命名的列来updatejoin您的原始df:

代码语言:javascript
复制
df = pd.json_normalize(data)

df = df.explode('and.or').reset_index(drop=True)
df_and_or = pd.json_normalize(df['and.or'])
df_and_or.columns = 'and.or.' + df_and_or.columns

df.update(df_and_or)
df = df.join(df_and_or[df_and_or.columns.difference(df.columns)])
print(df.drop('and.or', axis=1))

输出:

代码语言:javascript
复制
      name or.name or.ip-port-tcp and.name and.ip-port-tcp and.or.name             and.or.ip-address and.or.ip-port-tcp
0     HTTP       1  [10001, 9001]      NaN             NaN         NaN                           NaN                NaN
1  L3045_1     NaN            NaN        1             NaN           1  [123.3.208.1, 122.255.199.2]                NaN
2  L3045_1     NaN            NaN        1             NaN           2                           NaN          [443, 80]
3  L3045_2     NaN            NaN        1             443           1  [121.98.27.10, 10.241.58.30]                NaN

编辑:向最终结果添加新列

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71997029

复制
相关文章

相似问题

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