2017-01-26 1 views
4

Похожие на documentation example, я хочу, чтобы повернуть следующую dataframe:Поворотная на dataframe панды в то время как дедуплицирующие дополнительные столбцы

foo extra bar baz 
0 one  x A 1 
1 one  x B 2 
2 one  x C 3 
3 two  y A 4 
4 two  y B 5 
5 two  y C 6 

Результат должен быть

 extra A B C 

one  x 1 2 3 
two  y 4 5 6 

Можно ли это сделать в более короткий путь чем

  • отделить дополнительный столбец перед поворотом
  • дедуплицируя его отдельно
  • слияние его обратно на повернутые данные?

(Я ожидал, что команда поворота, чтобы быть в состоянии сделать это, но мои попытки не удалось.)

Вот код для dataframe играть с ним:

df = pd.DataFrame({'foo': ['one','one','one','two','two','two'], 
        'extra': ['x','x','x','y','y','y'], 
        'bar': ['A', 'B', 'C', 'A', 'B', 'C'], 
        'baz': [1, 2, 3, 4, 5, 6]}) 

ответ

1

Использование set_index и unstack

In [2087]: df.set_index(['foo', 'extra', 'bar'])['baz'].unstack().reset_index() 
Out[2087]: 
bar foo extra A B C 
0 one  x 1 2 3 
1 two  y 4 5 6 
+0

Ницца! Чтобы достичь требуемого результата, необходимо добавить окончательный '.set_index ('foo')'. В случае дублирования пар foo/bar это сохраняет ошибку 'pivot' команды. –

3

Вы можете использовать pivot_table, pivot принимает только один столбец, как индекс, колонка и значение в то время как pivot_table может принимать мульт iple колонна:

df.pivot_table('baz', ['foo', 'extra'], 'bar').reset_index() 

#bar foo extra A B C 
# 0 one  x 1 2 3 
# 1 two  y 4 5 6 
+0

Обратите внимание, что это имеет различное поведение для дублирующего Foo/бар пара: агрегирует значения БАЗА вместо выдачи ошибки. –

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