sno*_*ard 5 python dictionary namedtuple dataframe pandas
我的命名元组定义如下:
In[37]: from collections import namedtuple
Point = namedtuple('Point', 'x y')
Run Code Online (Sandbox Code Playgroud)
嵌套字典具有以下格式:
In[38]: d
Out[38]:
{1: {None: {1: Point(x=1.0, y=5.0), 2: Point(x=4.0, y=8.0)}},
2: {None: {1: Point(x=45324.0, y=24338.0), 2: Point(x=45.0, y=38.0)}}}
Run Code Online (Sandbox Code Playgroud)
我正在尝试从字典 d 创建一个 pandas 数据框,而不必执行 for 循环。
我通过执行以下操作成功地从字典的子集创建了数据框:
In[40]: df=pd.DataFrame(d[1][None].values())
In[41]: df
Out[41]:
x y
0 1 5
1 4 8
Run Code Online (Sandbox Code Playgroud)
但我希望能够从整个字典创建数据框。
我希望数据帧输出以下内容(我使用多索引表示法):
In[42]: df
Out[42]:
Subcase Step ID x y
1 None 1 1.0 5.0
2 4.0 8.0
2 None 1 45324.0 24338.0
2 45.0 38.0
Run Code Online (Sandbox Code Playgroud)
DataFrame的from_dict方法最多只支持两层嵌套,所以我无法使用它。我也在考虑修改d字典的结构来实现我的目标。此外,也许它不一定是一本字典。
谢谢。
我决定将键扁平化为一个元组(使用 pandas 0.18.1 进行测试):
In [5]: from collections import namedtuple
In [6]: Point = namedtuple('Point', 'x y')
In [11]: from collections import OrderedDict
In [14]: d=OrderedDict()
In [15]: d[(1,None,1)]=Point(x=1.0, y=5.0)
In [16]: d[(1,None,2)]=Point(x=4.0, y=8.0)
In [17]: d[(2,None,1)]=Point(x=45324.0, y=24338.0)
In [18]: d[(2,None,2)]=Point(x=45.0, y=38.0)
Run Code Online (Sandbox Code Playgroud)
最后,
In [7]: import pandas as pd
In [8]: df=pd.DataFrame(d.values(), index=pd.MultiIndex.from_tuples(d.keys(), names=['Subcase','Step','ID']))
In [9]:df
Out[9]:
x y
Subcase Step ID
1 NaN 1 1.0 5.0
2 4.0 8.0
2 NaN 1 45324.0 24338.0
2 45.0 38.0
Run Code Online (Sandbox Code Playgroud)