Python 带有内部堆叠子表的数据帧表

Python 带有内部堆叠子表的数据帧表,python,python-3.x,pandas,dataframe,data-analysis,Python,Python 3.x,Pandas,Dataframe,Data Analysis,假设我有来自数据库的以下输入数据 data = [{'abc': 'None', 'cde': 4, 'efg': 1, 'blah': {'k': 23, 'y': 26, 'u':48} },{'abc': 'hdf', 'cde':10, 'efg': 2, 'blah

假设我有来自数据库的以下输入数据

    data = [{'abc': 'None',
          'cde': 4,
          'efg': 1,
          'blah': {'k': 23,
                   'y': 26,
                   'u':48}
          },{'abc': 'hdf',
          'cde':10,
          'efg': 2,
          'blah': {'k': 244,
                   'y': 747,
                   'u':75,
                   'g':88},
        },
]
以下是我想制作的熊猫数据框的外观:

                       blah
       cde  abc    g    k    u   y
efg 1   4  'None'  N/A  23   48  26
    2   10 'hdf'   88   244  75  747
主要特点:

  • “efg”垂直合并并作为索引(我想,请 (如果我错了,请纠正我)
  • 诸如“cde”、“abc”等平面特征被视为普通列
  • 嵌套的dict将父项堆叠在其各自的子项之上 元素,任何没有关联值的嵌套字段 通过索引,“efg”不适用
尝试: 当我将数据放入pandas数据框时,我得到以下结果:

 abc  cde  efg  blah
k  None    4    1    23
u  None    4    1    48
y  None    4    1    26
g   hdf   10    2    88
k   hdf   10    2   244
u   hdf   10    2    75
y   hdf   10    2   747     
index   abc  cde  efg  blah
0     k  None    4    1    23
1     u  None    4    1    48
2     y  None    4    1    26
3     g   hdf   10    2    88
4     k   hdf   10    2   244
5     u   hdf   10    2    75
6     y   hdf   10    2   747
我怀疑pandas将嵌套的dict键作为索引,因此我将其重置,从而给出以下结果:

 abc  cde  efg  blah
k  None    4    1    23
u  None    4    1    48
y  None    4    1    26
g   hdf   10    2    88
k   hdf   10    2   244
u   hdf   10    2    75
y   hdf   10    2   747     
index   abc  cde  efg  blah
0     k  None    4    1    23
1     u  None    4    1    48
2     y  None    4    1    26
3     g   hdf   10    2    88
4     k   hdf   10    2   244
5     u   hdf   10    2    75
6     y   hdf   10    2   747
所以我通过pandas提供的'index'列来透视这个表,我希望它有一个堆叠的交叉表,其中'blah'父项是最上面的项,子列是它的嵌套dict('k','u','y','g')。此外,我希望其他列保持不变,只有“blah”部分合并了单元格。但是,我们得到的是:

>>> t_pivot = t_concat.pivot_table(columns='index')

>>> t_pivot

index     g      k     u      y
blah   88.0  133.5  61.5  386.5
cde    10.0    7.0   7.0    7.0
efg     2.0    1.5   1.5    1.5
好吧,不是很好,所以我可能需要明确说明我们应该根据什么数据编制索引:

t_pivot = t_concat.pivot_table(index = 'efg',columns=['index', 'cde'])

>>> t_pivot

       blah                                      
index     g     k            u           y       
cde      10    4      10    4     10    4      10
efg                                              
1       NaN  23.0    NaN  48.0   NaN  26.0    NaN
2      88.0   NaN  244.0   NaN  75.0   NaN  747.0
还是不对

那么,关于如何从带有嵌套dict的dict中形成数据帧,有什么想法吗?主要是使父元素及其各自的子元素的单元格正确合并。最终结果将进入html文档

我尝试过的其他事情: -将内部dict键转换为元组 -使用stack()方法,但似乎无法获得任何正确的外观

df = pd.DataFrame(data).set_index('efg')
sub_df = df.blah.apply(pd.Series)
sub_df = pd.concat({'blah': sub_df}, axis=1, names=['l1', 'l2'])
df = pd.concat({'': df}, axis=1, names=['l1', 'l2'])
df = pd.concat((df, sub_df), axis=1)
df = df.drop(('', 'blah'), axis=1)
print df

l1             blah                    
l2    abc cde     g      k     u      y
efg                                    
1    None  4  NaN    23.0   48.0  26.0 
2    hdf   10  88.0  244.0  75.0  747.0

分层列解决方案基于。

pd.DataFrame(data).set_index(['abc','efg','cde']).blah.apply(pd.Series)
这非常接近。谢谢你能解释一下这个想法是怎么产生的吗?这也是非常接近的,我们失去了堆叠在子元素之上的父元素。似乎由于将层次项目更改为系列,您失去了父级编辑:拼写、句子结构。更新了答案。现在它有了堆叠的列索引。这就是你要找的吗?是的!看起来不错。谢谢我目前正在尝试再次应用交叉表,但我看到您在这里添加了更多层。非常感谢。