в фрейме данных, после того, как вы поворачиваете таблицу, но хотите разместить значения один под другим? - PullRequest
0 голосов
/ 14 апреля 2020

Это вывод, но я хочу, чтобы значения zoo были ниже baz, а другой столбец отображал baz / zoo.

df.pivot(index='foo', columns='bar', values=['baz', 'zoo'])
      baz       zoo
bar   A  B  C   A  B  C
foo
one   1  2  3   x  y  z
two   4  5  6   q  w  t

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Вы можете использовать stack и указать уровень, который вы будете использовать sh для стека в длинном формате:

import pandas as pd
import numpy as np
idx = pd.MultiIndex.from_product([['bar', 'zoo'], ['A', 'B', 'C']])
df = pd.DataFrame(np.random.randn(6, 6), columns=idx)

Это мой фрейм данных (похож на ваш):

       bar                           zoo                    
          A         B         C         A         B         C
0 -0.314365  0.708094 -0.495491 -0.238145  1.654778  1.745649
1 -0.914321 -2.577186  1.221864 -0.984507 -0.861315 -0.496073
2 -1.549240  0.114752 -0.867636  0.935230  0.755379 -0.301134

Затем вы используете stack с уровнем 0:

df.stack(level=0)

Результат:

              A         B         C
0 bar  0.142700 -0.127700  1.914858
  zoo  1.900361 -0.038232 -0.620576
1 bar  1.772417 -1.362563  0.339079
  zoo  0.893481  0.000487  0.270656
2 bar -0.707328 -0.562236  0.435146

Если вы хотите, чтобы bar/zoo был в столбце вместо мультииндекса сбросьте индекс для этого уровня:

new_df = new_df.reset_index(level=1)

Я не знаю, как выглядел оригинальный df, поэтому я работал с примером, который вы дали. Но вы, вероятно, можете сделать это за одну операцию вместо pivot, а затем stack в исходном DataFrame.

0 голосов
/ 14 апреля 2020

Я думаю, вам нужно разделить столбцы перед поворотом, а затем изменить порядок в параметре values:

print (df)
   foo bar  baz  zoo
0  one   A    1    3
1  one   B    2    4
2  one   C    3    6
3  two   A    4    5
4  two   B    5    2
5  two   C    6    4

df['baz/zoo'] = df['baz'].div(df['zoo'])
df = df.pivot(index='foo', columns='bar', values=['zoo','baz','baz/zoo'])
print (df)
     zoo            baz             baz/zoo          
bar    A    B    C    A    B    C         A    B    C
foo                                                  
one  3.0  4.0  6.0  1.0  2.0  3.0  0.333333  0.5  0.5
two  5.0  2.0  4.0  4.0  5.0  6.0  0.800000  2.5  1.5
...