Как перевернуть таблицу по заданному условию?
Имеется таблица следующей структуры:
Название файла ; надпапка ; папка ; параметр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