首页 > 解决方案 > 将元组列表转换为具有多级列的数据框

问题描述

我有一个要转换为数据框的命名元组列表。元组是这样的:

s = pd.Series({'A': 1, 'B': 2}, 
              pd.Index([u'A', u'B'], 
                       name=u'submission_label'))

SingleExperimentStatistics = namedtuple('SingleExperimentStatistics', 
['metric_name', 'z_score', 'average'])

res = SingleExperimentStatistics(
  metric_name=None, 
  z_score=1.1826795129064109, 
  average=s,
)

打电话pd.Dataframe([res, res])给我们

   metric_name  z_score  average
0  None         1.18268  submission_label A 1 B 2 dtype: int64
1  None         1.18268  submission_label A 1 B 2 dtype: int64 

但我想要的是一个数据透视表,其中MultiIndex列是列名。基本上,是这样的:AB

   metric_name  z_score  average
                         A   B   
0  None         1.18268  1   2
1  None         1.18268  1   2 

这样做的正确方法是什么?

标签: pythonpandas

解决方案


我更喜欢通过将这些系列分成两列来使用简单的索引:

import pandas as pd
from collections import namedtuple
s = pd.Series({'A': 1, 'B': 2}, 
              pd.Index([u'A', u'B'], 
                       name=u'submission_label'))
SingleExperimentStatistics = namedtuple('SingleExperimentStatistics', 
    ['metric_name', 'z_score', 'average'])
res = SingleExperimentStatistics(
  metric_name=None, 
  z_score=1.1826795129064109, 
  average=s,
)

df = pd.DataFrame([res, res])
df1 = df.loc[:, ['metric_name', 'z_score']]
df1['A'] = df['average'].apply(lambda x: x['A'])
df1['B'] = df['average'].apply(lambda x: x['B'])
print(df1)

  metric_name  z_score  A  B
0        None  1.18268  1  2
1        None  1.18268  1  2

如果你真的想要多索引,你可以在这一步定义它:

index = pd.MultiIndex.from_tuples(zip(['metric_name', 'z_score', 'average', 'average'],
                         ['' ,'', 'A', 'B']))
df1.columns = index
print(df1)

  metric_name  z_score average   
                             A  B
0        None  1.18268       1  2
1        None  1.18268       1  2

推荐阅读