Как перевернуть таблицу по заданному условию?

Имеется таблица следующей структуры:

Название файла ; надпапка ; папка ; параметр1; параметр2; параметр3; параметр4
файл 1         ; путь1    ; папка1;    param1 ;    param2  ; param3   ;  param4
файл 2         ; путь1    ; папка1;    param1 ;            ; param3   ;  param4
файл 3         ; путь1    ; папка1;    param1 ;    param2  ;          ;  param4

файл 1         ; путь1    ; папка2;    param1 ;    param2  ; param3   ;  param4
......

Какие-то параметры могут быть только для файла 1 из папки, какие-то только для второго, а какие-то для всех.

Нужно получить все значения для папки (папка - точка отсчета, соответственно).

То есть, должна получиться такая таблица:

Папка ; надпапка ; файл1_параметр1 ; файл2_параметр1 ; файл3_параметр1 ; файл1_параметр2 ..... итд

При этом дополнительная сложность в том, что файлов в папке не всегда 3, может быть больше. Через циклы реализовать пока совсем не получается


Ответы (1 шт):

Автор решения: MaxU

Пример решения с использованием модуля Pandas:

In [200]: df
Out[200]:
  Название файла надпапка   папка параметр1 параметр2 параметр3 параметр4
0         файл 1    путь1  папка1    param1    param2    param3    param4
1         файл 2    путь1  папка1    param1       NaN    param3    param4
2         файл 3    путь1  папка1    param1    param2       NaN    param4
3         файл10    путь1  папка2    param1    param2    param3    param4

решение

cols = ["папка", "надпапка", "Название файла"]
t = df.drop(columns=cols).apply(lambda c: df["Название файла"] + "_" + c)

t2 = (df
      [cols]
      .join(t)
      .set_index(cols)
      .stack()
      .reset_index())

t2["col"] = "parm_" + t2.groupby(cols[:-1]).cumcount().astype(str)

res = (t2
       .pivot_table(index=cols[:-1], columns="col", values=0, 
                    aggfunc="first", fill_value="")
       .reset_index())

результат:

In [218]: res
Out[218]: ]
col   папка надпапка         parm_0         parm_1         parm_2         parm_3         parm_4         parm_5         parm_6         parm_7         parm_8         parm_9
0    папка1    путь1  файл 1_param1  файл 1_param2  файл 1_param3  файл 1_param4  файл 2_param1  файл 2_param3  файл 2_param4  файл 3_param1  файл 3_param2  файл 3_param4
1    папка2    путь1  файл10_param1  файл10_param2  файл10_param3  файл10_param4
→ Ссылка