Pandas Groupby и Pivot

#python #pandas

#python #панды

Вопрос:

У меня есть df настройка pandas следующим образом:

     product salesperson positionHours  levelHours 
0      soap        john            10          25
1      nuts        john            15          27
2      soap        doug            12          29
3      nuts        doug            11          24
4      soap        tory            19          20
5      nuts        tory            20          20
  

И я пытаюсь добиться следующего, как я могу это сделать в pandas?

     product     measurement   john  doug  tory 
0      soap   positionHours     10    12    19
1                levelHours     25    29    20 
3      nuts   positionHours     15    11    20
4                levelHours     27    24    20 
  

Ответ №1:

Будет множество способов, которыми вы можете это сделать. Первая пара, которая приходит на ум:

Расплавить, затем повернуть:

 (df.melt(["product", "salesperson"], var_name="measurement")
 .pivot(index=["product", "measurement"], columns="salesperson", values="value")
 .rename_axis(None, axis=1))

                       doug  john  tory
product measurement                    
nuts    levelHours       24    27    20
        positionHours    11    15    20
soap    levelHours       29    25    20
        positionHours    12    10    19
  

свод, затем стек

 (df.pivot(index="product", columns="salesperson", values=["positionHours", "levelHours"])
 .stack(0)
 .rename_axis(index=["product", "measurement"], columns=None))

                       doug  john  tory
product measurement                    
nuts    levelHours       24    27    20
        positionHours    11    15    20
soap    levelHours       29    25    20
        positionHours    12    10    19
  

установите индекс, затем выполните комбинацию unstack / stack

 (df.set_index(["product", "salesperson"])
 .rename_axis("measurement", axis=1)
 .unstack(1)
 .stack(0)
 .rename_axis(None, axis=1))

                       doug  john  tory
product measurement                    
nuts    levelHours       24    27    20
        positionHours    11    15    20
soap    levelHours       29    25    20
        positionHours    12    10    19