4

我是 python 和 pandas 的新手。而且我发现自己在 pandas 创建 Panel 或多索引 DataFrame 时遇到问题。

事实是我有一个多级字典,目前是三级,最终值为整数,我希望每个级别的键都是 Panel 的对应索引,对应 Panel 的 item ,major-axis,minor -轴到我的字典的第一,第二,第三级。当我从我的字典中创建一个时,索引不匹配。这是我的字典。

d={'item1':{'major0':{'minor0':1,
                      'minor1':2},
            'major1':{'minor0':3,
                      'minor1':4}
           },
   'item2':{'major0':{'minor0':5,
                      'minor1':6},
            'major1':{'minor0':7,
                      'minor1':8}
           }
  }

有什么简单的方法可以做到这一点。我浏览了 Pandas 教程,但没有看到任何对此的功能支持。

4

2 回答 2

3

您可以在构造后应用 swap_axes 方法:

In [1]: p = pd.Panel(d)

In [2]: p.swapaxes()
Out[2]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 2 (major_axis) x 2 (minor_axis)
Items axis: item1 to item2
Major_axis axis: major0 to major1
Minor_axis axis: minor0 to minor1

值得一提的是from_dictPanel 方法,它允许您传递一个方向(但显然只允许项目/次要,而您想做主要的......):

In [11]: pd.Panel.from_dict(d, orient='minor')  # default orient is items
Out[11]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 2 (major_axis) x 2 (minor_axis)
Items axis: major0 to major1
Major_axis axis: minor0 to minor1
Minor_axis axis: item1 to item2
于 2013-10-02T04:15:21.470 回答
2

我不确定这是否算一种简单的方法,因为折叠字典绝对是您必须手动完成的事情,但是:

# Collapse the first two levels of keys into tuples
# The dict comprehension could (and maybe should) be written
# with standard for loops
d_collapsed = {(outer_k, inner_k): inner_v for outer_k in d 
               for inner_k, inner_v in d[outer_k].items()}
df = pd.DataFrame.from_dict(d_collapsed)
# Now unpack the tuples again
df.columns = pd.MultiIndex.from_tuples(df.columns)

输出:

df
Out[18]: 
         item1           item2        
        major0  major1  major0  major1
minor0       1       3       5       7
minor1       2       4       6       8
于 2013-10-02T03:52:16.307 回答