我找到了一篇与我想要实现的目标类似的帖子,但反过来 将水平表格布局转换为垂直表格
我想改变这一点
城市 | 姓名 | 地址 |
---|---|---|
城市A | 公司A |
地址A |
城市B | 公司B |
地址B |
城市A | 公司C |
地址C |
城市B | 公司D |
地址D |
对此
名称_1 | 地址1 | 名称_2 | 地址2 | |
---|---|---|---|---|
城市A | 公司A |
地址A |
公司C |
地址C |
城市B | 公司B |
地址B |
公司D |
地址D |
我尝试了数据透视表,但无法在城市行内显示名称。它只是返回数字。我被这个问题困扰了好几个小时,但就是找不到使用数据透视表的方法。TIA。
答案1
我认为您不能使用 Excel 中的数据透视表来执行此操作。
但是,这可以使用 Windows Excel 2010+ 和 Microsoft 365(Windows 或 Mac)中提供的 Power Query 来实现
使用 Power Query
- 在数据表中选择一些单元格
Data => Get&Transform => from Table/Range
- 当 PQ 编辑器打开时:
Home => Advanced Editor
- 记下表格姓名在第 2 行
- 将下面的 M 代码粘贴到您所看到的位置
- 将第 2 行的表名改回最初生成的表名。
- 阅读评论并探索
Applied Steps
以了解算法
let
//change next line to reflect actual data source
Source = Excel.CurrentWorkbook(){[Name="Table46"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"City", type text}, {"Name", type text}, {"Address", type text}}),
//unpivot Name/Address columns
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"City"}, "Attribute", "Value"),
//Group by City
#"Grouped Rows" = Table.Group(#"Unpivoted Other Columns", {"City"}, {
//for each subgroup (City)
{"all", (t)=>let
//Add a numeric suffix to the Attributes to create the new column names
#"Add Index" = Table.AddIndexColumn(t,"idx",0,1,Int64.Type),
#"Number Suffix" = Table.AddColumn(#"Add Index", "Divide", each "_" & Text.From(Number.IntegerDivide([idx],2)+1)),
#"Remove idx" = Table.RemoveColumns(#"Number Suffix",{"idx"}),
#"Col Hdrs" = Table.CombineColumns(#"Remove idx",{"Attribute","Divide"},Combiner.CombineTextByDelimiter(""),"Attribute"),
//then pivot on the column header column
#"Pivot Table" = Table.Pivot(#"Col Hdrs", List.Distinct(#"Col Hdrs"[Attribute]), "Attribute","Value")
in
#"Pivot Table", type table}}),
//create a list of all the column Names
#"All Column Headers" = List.Distinct(
List.Accumulate(
#"Grouped Rows"[all],
{},
(state, current)=> state & List.RemoveFirstN(Table.ColumnNames(current),1)
)),
//Expand the Table (all) column
#"Expanded all" = Table.ExpandTableColumn(#"Grouped Rows", "all", #"All Column Headers"),
#"Changed Type1" = Table.TransformColumnTypes(#"Expanded all",List.Transform(#"All Column Headers", each {_, type text}))
in
#"Changed Type1"