В качестве отправной точки у меня есть массив, созданный из XML-файла, содержащий следующую информацию: p>
Код: Выделить всё
| Location | Description | Status | ..... | Product| Name | Price | Product| Name | Price | ...
| 1 | "Foo" | 1 | | | 124 | 4.2 | | 122 | 8.8 |
| 2 | "Bar" | 1 | | | 122 | 8.9 | | NaN | NaN |
Для дальнейшей обработки данных я хотите «сложить» данные последних 24 столбцов как подмножества по три, чтобы получить что-то вроде этого:
Код: Выделить всё
| Location | Description | Status | ..... | Product| Name | Price |
| 1 | "Foo" | 1 | | | 124 | 4.2 |
| | | | | | 122 | 8.8 |
| 2 | "Bar" | 1 | | | 122 | 8.9 |
| | | | | | NaN | NaN |
Код: Выделить всё
| Location | Description | Status | ..... | Product| Name | Price |
| 1 | "Foo" | 1 | | | 124 | 4.2 |
| 1 | "Foo" | 1 | | | 122 | 8.8 |
| 2 | "Bar" | 1 | | | 122 | 8.9 |
| 2 | "Bar" | 1 | | | NaN | NaN |
Шаг 1. Дедублируйте идентичные имена столбцов (чтобы позже можно было использовать df.stack():
Код: Выделить всё
cols=pd.Series(result_list_xml_t[0])
for dup in cols[cols.duplicated()].unique():
cols[cols[cols == dup].index.values.tolist()] = [dup + '.' + str(i) if i != 0 else dup for i in range(sum(cols == dup))]
Код: Выделить всё
columns_xml = pd.MultiIndex.from_arrays([xml_groups,cols])
Код: Выделить всё
| base | prod1 | prod 2
| Location | Description | Status | ..... | Product.1| Name.1 | Price.1 | Product.2| Name.2 | Price.2 | ...
1 | 1 | "Foo" | 1 | | | 124 | 4.2 | | 122 | 8.8 |
2 | 2 | "Bar" | 1 | | | 122 | 8.9 | | NaN | NaN |
Я пытался работать с df.stack из-за этой темы:
Переполнение стека — Не лучший многоиндексный фрейм данных
но df.stack(future_stack=True,level=0), похоже, не приближает меня к желаемому формату.
Код: Выделить всё
| | base | prod1 | prod2 | prod3| ...
0 | Location | 1 |
0 | Description| "Foo" |
0 | Status | 1 |
...
0 | Product.1 | | | | |
0 | Name.1 | | 124 | | |
0 | Price.1 | | 4.2 | | |
...
Подробнее здесь: https://stackoverflow.com/questions/791 ... of-columns
Мобильная версия