Укладка/дублирование строк в DataFrame с использованием только подмножества столбцовPython

Программы на Python
Ответить
Anonymous
 Укладка/дублирование строк в DataFrame с использованием только подмножества столбцов

Сообщение Anonymous »

У меня есть проблема, для которой я просто не могу найти работающее решение.
В качестве отправной точки у меня есть массив, созданный из 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   |
Первые n столбцов содержат общую информацию, которая одинакова для всех «продуктов» в соответствующей строке. Последние 24 столбца содержат 8 подмножеств по 3 столбца с одинаковым повторяющимся набором названий ["Товар", "Название", "Цена"].
Для дальнейшей обработки данных я хотите «сложить» данные последних 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))]
Шаг 2. Создайте мультииндекс для группы

Код: Выделить всё

columns_xml = pd.MultiIndex.from_arrays([xml_groups,cols])
С помощью этого я создаю файл pandas df, который выглядит следующим образом:

Код: Выделить всё

  | 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     |
Теперь я хотел бы складывать только prod-группы, сохраняя при этом базовую группу. Можно ли это сделать с помощью функции стека или есть другой, более эффективный подход?
Я пытался работать с 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   |      |      |
...
Я также пытался использовать комбинацию .melt() и .set_index(), предложенную следующей веткой Unstack или Pivot в Pandas, но это тоже не приблизило меня.< /п>

Подробнее здесь: https://stackoverflow.com/questions/791 ... of-columns
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»