网友问题:Excel行列条件转换问题,十几万条数据,怎么实现如表一到表二的效果?
表一
采集时间 | 测风 | 风速值 |
2023-08-01 00:00:30 | 10m | 3.33 |
2023-08-01 00:00:30 | 30m | 4.96 |
2023-08-01 00:00:30 | 50m | 5.43 |
2023-08-01 00:00:30 | 70m | 5.09 |
2023-08-01 00:00:30 | 90m | 5 |
2023-08-01 00:15:30 | 10m | 1.08 |
2023-08-01 00:15:30 | 30m | 2.13 |
2023-08-01 00:15:30 | 50m | 3.79 |
2023-08-01 00:15:30 | 70m | 4.54 |
2023-08-01 00:15:30 | 90m | 4.9 |
表二
采集时间 | 10m | 30m | 50m | 70m | 90m |
2023-08-01 00:00:30 | 3.33 | 4.96 | 5.43 | 5.09 | 5 |
2023-08-01 00:15:30 | 1.08 | 2.13 | 3.79 | 4.54 | 4.9 |
方案一:PIVOTBY函数
这实际是一个一维表变成二维表的问题。这时候就会想到PIVOTBY函数,非常容易到达想要的结果。去年12月份分享了PIVOTBY函数的应用案例,具体见GROUPBY函数升级增强版PIVOTBY函数:“透视王子”来了以及GROUPBY+VSTACK和PIVOTBY+VSTACK都可实现超强的多表透视,谁更强?。

E1格录入公式:=PIVOTBY(A:A,B:B,C:C,AVERAGE,1,0,,0,,A:A<>"")
注意:这里需要重点关注以下几个参数
第4个参数汇总方式(function)涵盖了求和(SUM)、平均值(AVERAGE)、计数(COUNT)、最大值(MAX)、最小值(MIN)、乘积值(PRODUCT)等多种计算方式,还能用 LAMBDA 表达式自定义复杂规则。这里面用的是平均值(AVERAGE),如果同一时间同一测风高度有多个值,取平均值(AVERAGE)更为合适,如果都是唯一值,用求和(SUM)、最大值(MAX)、最小值(MIN)等也都可以的。
第5个参数表头设置(field_headers)在这里选用“1”,表示数据源有表头但不显示,目的就是为了打到表二的格式,这时候发现E1为空,直接输入“采集时间”,或“=A1”,都可以达到想要的结果。
第6个参数行标题总计与小计显示(row_total_depth):确定行标题是否应包含总计,在这里选用“0”,表示是不显示总计,数据简洁明了,只看分组内的数据。
第8个参数列标题总计与小计显示(col_total_depth):确定列标题是否应包含总计,在这里选用“0”,表示是不显示总计。
第10个参数筛选条件(filter_array),这是数据的“过滤器”,在这里设置为A:A<>"",精准定位目标数据A列不为空的数据,直接找到想要的结果,否则表二。
大家会发现E列不是时间格式,这个直接通过“单元格式设置”功能,在分类中找到“日期”项,选择想要的时间类型即可,如下图。

时间格式设置好后就变成下图:


或把第5个参数表头设置(field_headers)改为3,然后使用DROP把多余的第一行丢掉,在E1格录入公式:=DROP(PIVOTBY(A:A,B:B,C:C,AVERAGE,3,0,,0,,A:A<>""),1)
结果如下图:

PIVOTBY函数是Excel 最新版本中引入的函数,可以在不借助数据透视表的情况下,通过公式对数据进行分类汇总和透视操作,而且可以实时更新,解决了传统透视表需要手动刷新的问题,能够显著提升工作效率。
方法二:数据透视表
当然此种情况下也是可以借助数据透视表达到想要的结果,对照前面PIVOTBY函数参数一样,将“采集时间”拖到“行”区域,将“测风”拖到“列”区域,将“风速值”拖到“值”区域,同时去除“求和项”和去除“分类汇总”,也能实现上面的效果,如果有数据更新,需要手动刷新。
注意:
PIVOTBY函数和数据透视表在处理小数据量非常方便,但如果如网友所说,超过十几万条数据时,就会导致公式计算非常慢,甚至造成奔溃的情况。
方法三:使用Power Query透视列
在需要处理大量数据的清洗和转换的时候,Power Query 的优势就来了,它是 Excel 内置的 ETL 工具,专门用于处理大量数据的清洗和转换。
Step 1:创建表
选中表一数据区域A列到C列,然后按Ctrl+T,勾选“表包含标题“,按确定即可,如下图:


注意:这里面表数据来源一定要选择有数据而非有空值无数据的表格,否则后面执行透视操作时,按上图直接取A列到C列数据,就会报错:“Expression.Error:无法将值null 转换为类型 Text。”
Step 2:打开 Power Query 编辑器
选中表格,点击菜单栏中的“数据“,然后点击”来自表格/区域“,进入 Power Query 编辑器。

Step3:执行透视操作
在 PQ 编辑器中,选中“测风”列,点击菜单栏“转换“,点击”透视列“,在弹出的对话框中:“值列”选择”风速值“,“高级选项”中“聚合值函数”选择“不要聚合”(因为每个时间+测风组合是唯一值),点击“确定”,如下图:

Step4 输出结果
点击“主页”中的“关闭并上载”,就会得出一个新表页,完成后的效果完全符合我们想要的表二:采集时间为行,不同测风高度为列,风速值为交叉单元格。
如下图:


注意:以后如果有新数据,只需右键点击结果表,选择“刷新”即可。
总结:在少量数据时,PIVOTBY函数更为方便,在超大量数据时,Power Query无可替代!在此案例中,推荐方案:Power Query 透视列!
夜雨聆风