2016-11-03 8 views
2

У меня есть пустой DataFrame:Как добавить иерархически с именем столбца в панде DataFrame

import pandas as pd 
df = pd.DataFrame() 

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

df['foo', 'bar'] = [1,2,3] 

Но это дает столбец, имя которого кортеж:

(foo, bar) 
0   1 
1   2 
2   3 

Я хочу это:

foo 
    bar 
0 1 
1 2 
2 3 

Что я могу получить, если я построить совершенно новый DataFrame следующим образом:

pd.DataFrame([1,2,3], columns=pd.MultiIndex.from_tuples([('foo', 'bar')])) 

Как я могу создать такой макет при добавлении новых столбцов в существующий DataFrame? Количество уровней всегда 2 ... и я знаю все возможные значения для первого уровня заранее.

+0

Это дубликат? Http: //stackoverflow.com/questions/17985159/creating-dataframe-with-hierarchical-columns – AER

+0

Вы, очевидно, хорошо себя зарекомендовавший себя пользователь. Возможно, я что-то пропустил. Я выложу его в форме ответа, если это отдельный вопрос выше. – AER

+0

@AER: Этот вопрос задает вопрос о том, как добавить дополнительный уровень в существующие столбцы. Я хочу добавить дополнительный столбец со своими уровнями. Другими словами, я знаю, как сделать конечный результат, который я хочу, если я построю DataFrame с нуля, но я пытаюсь понять, как это сделать, создавая его по одному столбцу за раз (обычная техника при использовании одно- имена столбцов уровня). –

ответ

0

Я не уверен, что есть способ избежать этого, не переопределяя индекс столбцов как Multiindex. Если я не ошибаюсь, уровни класса MultiIndex на самом деле состоят из объектов Index. Хотя вы можете иметь DataFrames с иерархическими индексами, которые не имеют значений для одного или нескольких уровней, сам объект индекса по-прежнему должен быть MultiIndex. Например:

In [2]: df = pd.DataFrame({'foo': [1,2,3], 'bar': [4,5,6]}) 

In [3]: df 
Out[3]: 
    bar foo 
0 4 1 
1 5 2 
2 6 3 

In [4]: df.columns 
Out[4]: Index([u'bar', u'foo'], dtype='object') 

In [5]: df.columns = pd.MultiIndex.from_tuples([('', 'foo'), ('foo','bar')]) 

In [6]: df.columns 
Out[6]: 
MultiIndex(levels=[[u'', u'foo'], [u'bar', u'foo']], 
      labels=[[0, 1], [1, 0]]) 

In [7]: df.columns.get_level_values(0) 
Out[7]: Index([u'', u'foo'], dtype='object') 

In [8]: df 
Out[8]: 
     foo 
    foo bar 
0 4 1 
1 5 2 
2 6 3 

In [9]: df['bar', 'baz'] = [7,8,9] 

In [10]: df 
Out[10]: 
     foo bar 
    foo bar baz 
0 4 1 7 
1 5 2 8 
2 6 3 9 

Так как вы можете видеть, как только мультииндексное на месте вы можете добавить столбцы, как вы думали, но, к сожалению, я не знаю ни одного способа принуждать к DataFrame адаптивно принять мультииндексный.

2

Если вы хотите построить многоиндексной DF один столбец в то время, вы можете добавить кадры и опускать Nan's представил оставив вас с желаемым мультииндексом DF, как показано:

Demo :

df = pd.DataFrame() 
df['foo', 'bar'] = [1,2,3] 
df['foo', 'baz'] = [3,4,5] 
df 

Image

Принимая один столбец на ти меня и построить соответствующие заголовки.

pd.concat([df[[0]], df[[1]]]).apply(lambda x: x.dropna()) 

Image

В связи с Nans производства, значения typecasted в поплавковой DTYPE, которые могут быть повторно литым обратно целых чисел с помощью DF.astype(int).

Примечание:

Это предполагает, что количество уровней согласования во конкатенации.

 Смежные вопросы

  • Нет связанных вопросов^_^