Преобразование таблицы для отражения имен столбцов в значениях строк

В следующей таблице есть рейтинги брендов (значения строк) по клиентам:

CustID Бренд1 Бренд2 Бренд3 Бренд4 Бренд5 Бренд6 Бренд10 1 3 1 2 5 4 2 2 1 4 3 5 3 2 3 4 1 5

Я хотел бы преобразовать эту таблицу, чтобы представить рейтинги в виде столбцов, а бренды — в виде строк:

CustID 1 2 3 4 5 1 Бренд2 Бренд3 Бренд1 Бренд10 Бренд5 2 Бренд3 Бренд2 Бренд6 Бренд5 Бренд10 3 Бренд6 Бренд1 Бренд2 Бренд4 Бренд10

Всего у меня 116 клиентов, 10 брендов и рейтинги от 1 до 5. Я пробовал отменять и поворачивать таблицы, но значения в сводных таблицах показывают количество, а не названия брендов.

Как я могу преобразить свой стол?

Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
1
0
137
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

С Power Pivot это довольно просто:

let
    Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
    UnpivotedData = Table.UnpivotOtherColumns(Source, {"CustID"}, "Brand", "Rank"),
    FilteredData = Table.SelectRows(UnpivotedData, each [Rank] <> null),
    ChangeType = Table.TransformColumnTypes(FilteredData,{{"Rank", type text}}),
    PivotedData = Table.Pivot(ChangeType, List.Distinct(ChangeType[Rank]), "Rank", "Brand"),
    SortedColumnNames = List.Sort(List.RemoveFirstN(Table.ColumnNames(PivotedData), 1), (x) => Number.FromText(x)),
    SortedColumns = Table.ReorderColumns(PivotedData, List.Combine({{"CustID"}, SortedColumnNames}))
in
    SortedColumns

Хотя у вас уже есть решение с использованием Power Query, вот несколько методов с использованием формул Excel:


• Формула, используемая в ячейке A6

=LET(
     _Data, Ranktbl[#All],
     _Rank, DROP(_Data,1,1),
     _RankN, SORT(UNIQUE(TOROW(_Rank,1),1),,,1),
     _Output, MAKEARRAY(ROWS(_Data)-1,COLUMNS(_RankN),LAMBDA(r,c,
     INDEX(TOCOL(IF(INDEX(_RankN,c)=_Rank,
     DROP(TAKE(_Data,1),,1),NA()),2),r,))),
     HSTACK(TAKE(_Data,,1),VSTACK(_RankN,_Output)))

Также, если применимо, можно использовать функцию PIVOTBY():

=LET(
     _Data, Ranktbl[#All],
     _Fx, LAMBDA(α,δ, TOCOL(IF(α<>"",δ,NA()),2)),
     _Rank, DROP(_Data,1,1),
     PIVOTBY(_Fx(_Rank,DROP(TAKE(_Data,,1),1)),
             _Fx(_Rank,_Rank),
             _Fx(_Rank,DROP(TAKE(_Data,1),,1)),
             SINGLE,,0,,0))

Или, чтобы записать каждый шаг, чтобы его было легче читать:

=LET(
     _Data, Ranktbl[#All],
     _Fx, LAMBDA(α,δ, TOCOL(IF(α<>"",δ,NA()),2)),
     _Rank, DROP(_Data,1,1),
     _Customer, _Fx(_Rank,DROP(TAKE(_Data,,1),1)),
     _Brand, _Fx(_Rank,DROP(TAKE(_Data,1),,1)),
     _RankN, _Fx(_Rank,_Rank),
     PIVOTBY(_Customer,_RankN,_Brand,SINGLE,,0,,0))

Спасибо, однако пусть с моими формулами не получилось((

B T 03.07.2024 03:57

@BT, что ты имеешь в виду, говоря «не работает». Все приведенные формулы применяются в Excel и определенно работают. Когда вы говорите, что не работаете, следует публиковать соответствующие скриншоты, чтобы подтвердить свое обоснование, иначе это теряет смысл!

Mayukh Bhattacharya 03.07.2024 12:03

Извините за такую ​​расплывчатость, я не могу опубликовать здесь снимок экрана, но во всплывающем окне появляется ошибка: «Первый аргумент LET должен быть допустимым именем»

B T 03.07.2024 16:13

@BT, братан, это вообще не проблема, причина в том, что, возможно, у вас есть какие-то определенные имена или имена листов, поскольку _Data просто измените переменные внутри LET() по своему усмотрению. Формула должна работать!

Mayukh Bhattacharya 03.07.2024 16:21

Сделаю, спасибо! Итак, _Data — это имя листа в вашей формуле?

B T 03.07.2024 16:45

@BT, есть ли у вас какие-либо определенные имена или имена листов в качестве какой-либо из этих определенных переменных в LET()? Нет, я задаю вам вопрос, я не знаю, какие у вас определенные имена или имена листов.

Mayukh Bhattacharya 03.07.2024 16:47

Другой вариант формулы, основанный на ваших примерных данных и описании, если количество рангов в строке всегда равно 5 (не больше и не меньше):

=LET(
    tbl; Table1[#All];
    rank; DROP(tbl; 1; 1);
    test; ISNUMBER(rank);
    unpivot; SORTBY(
        TOCOL(IFS(test; DROP(TAKE(tbl; 1);; 1)); 2);
        TOCOL(IFS(test; SEQUENCE(ROWS(rank))); 2); 1;
        TOCOL(IFS(test; rank); 2); 1);
    HSTACK(TAKE(tbl;; 1); VSTACK(SEQUENCE(1; 5); WRAPROWS(unpivot; 5)))
)

Однако, если количество рейтингов в строке не фиксировано, используйте следующую модифицированную версию:

=LET(
    tbl; Table1[#All];
    rank; DROP(tbl; 1; 1);
    n; COLUMNS(rank);
    cols; SEQUENCE(; n);
    test; ISNUMBER(rank);
    unpivot; SORTBY(
        TOCOL(IF(test; DROP(TAKE(tbl; 1);; 1); ""));
        TOCOL(IF(cols; SEQUENCE(ROWS(rank)))); 1;
        TOCOL(IF(test; rank)); 1);
    pivot; HSTACK(TAKE(DROP(tbl; 1);; 1); WRAPROWS(unpivot; n));
    FILTER(VSTACK(HSTACK("CustID"; cols); pivot); BYCOL(pivot; LAMBDA(col; SUM(LEN(col)))))
)

При необходимости откорректируйте определение tbl, но обязательно включите строку заголовка таблицы или диапазона.

Примечание. В приведенных выше формулах я использовал разделители точка с запятой из-за вашего обсуждения в комментариях... Ошибка «Первый аргумент LET должен быть допустимым именем» может возникнуть при копировании/вставке формул, найденных в Интернете, если автор использует другой системный разделитель, чем у вас. Если разделителем по умолчанию не является точка с запятой, сначала вставьте формулы в Блокнот и используйте «Правка» > «Заменить...», чтобы заменить точки с запятой, например, запятыми (или наоборот).

Другие вопросы по теме