根据嵌套列表从 JSON 构建创建 Pandas 数据框
Create Pandas dataframe from JSON build based on nested lists
我想使用以下嵌套列表来:
- 首先:创建字典
- 其次:从字典中创建一个Pandas数据框
结构=[['jumps', [['fox', [['The'], ['quick'], ['brown']]], ['over', [['dog', [['the'], ['lazy']]]]]]]]
此嵌套列表来自具有依赖关系的解析树结构:
jumps
_____|________
| over
| |
fox dog
____|_____ ___|____
The quick brown the lazy
我的想法是将这个嵌套列表转换为 JSON 文件,然后创建一个 Pandas 数据框,如下所示:
jumps fox
jumps over
fox The
fox quick
fox brown
over dog
dog the
dog lazy
以便可以使用 networkx
绘制此数据框。
我试过 json.dumps
和 dict
到目前为止都没有成功。
如有任何见解,我们将不胜感激。
我错误地阅读了问题并假设您想要绘制图形,而不是转换嵌套列表。 @Nick 的解决方案是最好的方法。 仅将此答案视为附加信息而不是解决方案
让我们使用 graphviz
并为有向图创建我们自己的 DOT -
from graphviz import Source
l = [('jumps','fox'),
('jumps', 'over'),
('fox', 'The'),
('fox', 'quick'),
('fox', 'brown'),
('over', 'dog'),
('dog', 'the'),
('dog', 'lazy')]
dotgraph = 'digraph G {' + ' '.join([i+'->'+j for i,j in l]) + '}'
print(dotgraph)
s = Source(dotgraph, filename="test1.gv", format="png")
s.view()
digraph G {
jumps->fox
jumps->over
fox->The
fox->quick
fox->brown
over->dog
dog->the
dog->lazy
}
您可以使用 graphviz
here on their visual editor. Also read the documentation 来获得这些图表元素和更复杂图表的自定义选项。
这是一个树状结构,这让我觉得这里应该使用递归函数。我会这样做:
import pandas as pd
def recurse(l, parent=None):
assert isinstance(l, list)
for item in l:
if isinstance(item, str):
if parent is not None:
yield (parent, item)
parent = item
elif isinstance(item, list):
yield from recurse(item, parent)
else:
raise Exception(f"Unknown type {type(item)}")
structure=[['jumps', [['fox', [['The'], ['quick'], ['brown']]], ['over', [['dog', [['the'], ['lazy']]]]]]]]
df = pd.DataFrame(recurse(structure), columns=['from', 'to'])
它是如何工作的:它遍历每个列表,记住它看到的最后一个项目是什么。对于它找到的每个列表,它都会用该列表调用自己。此函数的输出是一个生成器,它为图中的每个“边”生成一个元组。这可以导入到 pandas 数据框中。
输出:
from to
0 jumps fox
1 fox The
2 fox quick
3 fox brown
4 jumps over
5 over dog
6 dog the
7 dog lazy
我想使用以下嵌套列表来:
- 首先:创建字典
- 其次:从字典中创建一个Pandas数据框
结构=[['jumps', [['fox', [['The'], ['quick'], ['brown']]], ['over', [['dog', [['the'], ['lazy']]]]]]]]
此嵌套列表来自具有依赖关系的解析树结构:
jumps
_____|________
| over
| |
fox dog
____|_____ ___|____
The quick brown the lazy
我的想法是将这个嵌套列表转换为 JSON 文件,然后创建一个 Pandas 数据框,如下所示:
jumps fox
jumps over
fox The
fox quick
fox brown
over dog
dog the
dog lazy
以便可以使用 networkx
绘制此数据框。
我试过 json.dumps
和 dict
到目前为止都没有成功。
如有任何见解,我们将不胜感激。
我错误地阅读了问题并假设您想要绘制图形,而不是转换嵌套列表。 @Nick 的解决方案是最好的方法。 仅将此答案视为附加信息而不是解决方案
让我们使用 graphviz
并为有向图创建我们自己的 DOT -
from graphviz import Source
l = [('jumps','fox'),
('jumps', 'over'),
('fox', 'The'),
('fox', 'quick'),
('fox', 'brown'),
('over', 'dog'),
('dog', 'the'),
('dog', 'lazy')]
dotgraph = 'digraph G {' + ' '.join([i+'->'+j for i,j in l]) + '}'
print(dotgraph)
s = Source(dotgraph, filename="test1.gv", format="png")
s.view()
digraph G {
jumps->fox
jumps->over
fox->The
fox->quick
fox->brown
over->dog
dog->the
dog->lazy
}
您可以使用 graphviz
here on their visual editor. Also read the documentation 来获得这些图表元素和更复杂图表的自定义选项。
这是一个树状结构,这让我觉得这里应该使用递归函数。我会这样做:
import pandas as pd
def recurse(l, parent=None):
assert isinstance(l, list)
for item in l:
if isinstance(item, str):
if parent is not None:
yield (parent, item)
parent = item
elif isinstance(item, list):
yield from recurse(item, parent)
else:
raise Exception(f"Unknown type {type(item)}")
structure=[['jumps', [['fox', [['The'], ['quick'], ['brown']]], ['over', [['dog', [['the'], ['lazy']]]]]]]]
df = pd.DataFrame(recurse(structure), columns=['from', 'to'])
它是如何工作的:它遍历每个列表,记住它看到的最后一个项目是什么。对于它找到的每个列表,它都会用该列表调用自己。此函数的输出是一个生成器,它为图中的每个“边”生成一个元组。这可以导入到 pandas 数据框中。
输出:
from to
0 jumps fox
1 fox The
2 fox quick
3 fox brown
4 jumps over
5 over dog
6 dog the
7 dog lazy