我尝试使用json_normalize来转换嵌套的ordereddict。但是,对于嵌套的ordereddict,它只能定义标头,而将值设置为NaN。下面是有序dict的样本数据
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中它应该在头和值之间对齐预期的输出。
发布于 2022-04-25 11:24:03
我不知道您的数据会有多复杂,我也不确定dataframe是表示防火墙规则的逻辑组合的最好方法。无论如何,对于这个特定的列,您可以首先对它进行explode以获得新的行,然后对已爆炸的列进行json_normalize,最后使用重命名的列来update和join您的原始df:
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))输出:
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编辑:向最终结果添加新列
https://stackoverflow.com/questions/71997029
复制相似问题