2015-03-11 6 views
0

Предположит, у меня есть следующий DataFrame:Перепрофилирование Панда DataFrame с Повторным индексом столбца

>>> cols = ['model', 'parameter', 'condition', 'value'] 
>>> df = pd.DataFrame([['BMW', '0-60', 'rain', '7'], ['BMW', '0-60', 'sun', '7'], 
        ['BMW','mpg', 'rain','25'], 
        ['BMW', 'stars', 'rain','5'], 
        ['Toyota', '0-60', 'rain','9'], 
        ['Toyota','mpg', 'rain','40'], 
        ['Toyota', 'stars', 'rain','4']], columns=cols) 

>>> df 
    model parameter condition value 
0  BMW  0-60  rain  7 
1  BMW  0-60  sun  7 
2  BMW  mpg  rain 25 
3  BMW  stars  rain  5 
4 Toyota  0-60  rain  9 
5 Toyota  mpg  rain 40 
6 Toyota  stars  rain  4 

Это список показателей эффективности для различных автомобилей в различных условиях. Разумеется, это составленный набор данных, но его представитель моей проблемы.

В конечном итоге я хочу иметь наблюдение за данным условием в его собственной строке и каждой метрике в ее собственной колонке. Это будет выглядеть примерно так:

parameter condition 0-60 mpg stars 
    model   
0  BMW  rain  7  25  5 
1  BMW  sun  7  NaN NaN 
2  Toyota rain  9  40  4 

Обратите внимание, что я только что составил формат выше. Я не знаю, создаст ли Панда нечто подобное, но это общая идея. Я бы также, конечно, преобразовал «условие» в булевский массив и заполнил NaNs.

Моя проблема в том, что когда я пытаюсь использовать сводный метод, я получаю сообщение об ошибке. Я думаю, что это потому, что мой «колонковый» ключ повторяется (потому что у меня есть статистика BMW 0-60 для дождя и для условий солнца).

df.pivot(index='model',columns='parameter') 
ValueError: Index contains duplicate entries, cannot reshape 

Кто-нибудь знает о скользком способе сделать это? Я нахожу, что многие из этих методов реставрации Pandas являются довольно тупыми.

+0

оба ответа верны. другой связанный с этим вопрос http://stackoverflow.com/questions/17333644/pandas-dataframe-transforming-frame-using-unique-values-of-a-column – goofd

ответ

1

Вы можете просто изменить индекс и поместить значение его ...

df.set_index(['model', 'condition', 'parameter']).unstack() 

возвращает

    value   
parameter   0-60 mpg stars 
model condition     
BMW rain   7 25  5 
     sun   7 NaN NaN 
Toyota rain   9 40  4 
0

Вы можете получить результат, который вы хотите с помощью pivot_table и проходящее следующие параметры:

>>> df.pivot_table(index=['model', 'condition'], values='value', columns='parameter') 
parameter   0-60 mpg stars 
model condition     
BMW rain   7 25  5 
     sun   7 NaN NaN 
Toyota rain   9 40  4 

(Возможно, вам необходимо убедиться, что столбец «значение» имеет числовые типы fi или вы можете пройти aggfunc=lambda x: x в функции pivot_table, чтобы обойти это требование.)

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