преобразование списка кортежей в фрейм данных с многоуровневыми столбцами - PullRequest
0 голосов
/ 18 октября 2018

У меня есть список именованных кортежей, которые я хочу преобразовать в фрейм данных.Кортежи выглядят так:

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, где A и B являются именами столбцов.По сути, что-то вроде этого:

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

Как правильно это сделать?

1 Ответ

0 голосов
/ 18 октября 2018

Я бы предпочел работать с простым индексом, разбивая эти ряды на два столбца:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...