ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 12620|回复: 12

[原创] Power Query:1个问题,15种解法,练习22个常用函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-7-30 16:44 | 显示全部楼层 |阅读模式
本帖最后由 hugo_huang 于 2018-7-30 20:42 编辑

        一直以来,我都在设想找一些相对简单而又能多练几个函数的案例,前段时间在群里看到这个需求的时候,突然脑洞大开,基于这个问题,将Power Query的List类和Text类常用函数给撸了一遍,写了15种解法,有简单有复杂,也不考虑孰优孰劣,供需要进一步熟悉这些常用函数的朋友加以练习。
       问题如下:
  • 有一个产品名称(实际工作中当然是很多的,此仅以一个为例)
  • 有一堆常见的搜索关键词
  • 希望知道哪些搜索关键词都被包含在了这个产品名称中(实际数据分析中常常以此方法来判断某个产品名称的综合搜索人气或热度)

        如下图所示:
640.jpg
        为简化问题,本练习只考虑搜索词中的每个字是否都被标题所包含,若都包含,则匹配度为100%(或只标注为true即可),否则匹配度按被包含的字数和搜索词本身的字数之间的比例计算(或只标注为false即可)。
       需要结果如下(两种方式都可接受):
641.png
       如果到这里感觉问题很难理解,那就直接到案例中看吧。

PQ-M及函数:1个问题-15中解法-22个常用函数.rar

95.01 KB, 下载次数: 908

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-30 16:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 hugo_huang 于 2018-7-30 20:48 编辑


       下面开始15个不同的解法及简要说明。
1、找出两者都有的字(交集)并计数(记录式写法)
640 (1).jpg
     思路很明确,先将标题和搜索词拆成字列表(Text.ToList),再用List.Intersect获得两个列表中都有的字(交集),最后用List.Count函数得到相应的字数进行相除,求得匹配度。
2、找出两者都有的字(交集)并计数(函数嵌套式写法)
640(2).png
       思路跟方法1基本一样,但因为直接用函数嵌套的方式,所以为避免最后计算搜索词长度时再次拆分(方法1中因为用字段b得到了搜索词的拆分列表,因此后面可以直接用List.Count取得长度),所以直接用Text.Length函数计算长度。
3、将未被标题包含的字转为null,并计算转换后的非null值的个数
6403.png
      通过List.Transform函数对拆分的搜索词列表进行转换,如果搜索词的某个字被标题所包含,则保留原样,如果没有被标题所包含,则转为null值。这样,列表转换后就可以用List.NonNullCount函数统计其中有多少个非null的值。
4、将未被标题包含的字转为0,被包含的转为1,然后求和
6404.png
       思路跟方法3类似,通过List.Transform函数对拆分的搜索词列表进行转换,如果搜索词的某个字被标题所包含,则转为1,如果没有被标题所包含,则转为0。这样,列表转换后就可以用List.Sum函数求和。
5、基于搜索词进行累积处理,若某字被包含,则累积到列表中
6405.png
       用List.Accumulate的累积计算替代List.Transform的列表转换方法,其他内容类似。其中List.Accumulate函数的运行机制稍微复杂,但该函数功能比较强大,后续再通过更多的例子专门讲解。
6、使用TransformMany函数直接转换为1或0,然后进行求和
6406.png
       List.TransformMany函数可以实现将1个列表的元素转换为一个新列表,然后再对旧列表和新列表进行综合的运算。这里用比较简单,直接将搜索词列表转换为是否包含相应搜索词的新列表,然后对新列表进行判断生成1或0的序列——旧列表(o,n)中的o不需要使用。
7、使用List.Generate构造出1,0判断结果列表然后求和
6407.png
      思路仍然是针对关键词的每个字,如果被包含就得到1,不包含就得到0,但通过List.Generate构造出来,这个函数的使用相对复杂一些,后续专门撰文讲解。
8、判断关键词中的每个字是否都被包含
6408.png
      核心仍然是用List.Transform函数对关键词中的每个字进行判断,转换为true或false列表,然后用List.AllTrue函数判断是否都为true(包含)。
9、直接判断某个List是否全包含另一个List
6409.png
      将内容和搜索词均转换为列表,然后用List.ContainsAll函数判断内容列表是否全包含搜索词列表。这个最判断最简单直接。
10、将内容和搜索词组合并后再和原来的内容(均删重复)进行比较
6410.png
       如果搜索词都包含在内容中,那么两者合并后的内容不会增加新的字眼,因此删重复后仍然和原来的内容(删重复)一致。
11、用List.MatchesAll函数判断搜索词中的每个字是否都在内容中
6411.png
       List.MatchesAll函数允许对一个列表进行判断,看这个列表是否都满足某一个条件,这里即对搜索词的每一个字进行判断,看其中每一个字是否都满足条件——包含在相应的内容中。
12、按条件对搜索词列表进行删除,看是否会被删空
6412.png
     List.Skip函数可以按条件对列表的内容进行跳过(删除),从而保留未满足条件的项目,在这里可以对搜索词进行相应的处理:即如果搜索词的某个字在内容中,则跳过(删除),最后看是否会被全部删掉而得到一个空列表。
13、直接删除列表的匹配内容,看是否会被删空
6413.png
      思路和上面用List.Skip类似,但直接用List.RemoveMatchingItems来实现,即参照内容列表对搜索词进行删除,最后如果删成空的,那也说明搜索词里的每个字都能在内容里找到。
14、用函数List.RemoveItems直接删除列表的匹配内容,看是否会被删空
6414.png
      在这个问题里,List.RemoveItems函数和List.RemoveMatchingItems的用法基本一样,关于这两个函数的区别,后续专门撰文讲解。
15、直接按内容列表删除搜索词的文本内容,看是否会被删空
6415.png
      既然可以直接用删除的方法进行判断,那当然也可以直接用文本删除的方式来判断,只是文本删空后是"",而列表删空后是{}。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-30 21:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
以上通过15种方法来实现了同一个目标,涉及到的函数包括:
  • Text.ToList
  • List.Intersect
  • List.Count
  • Text.Length
  • List.NonNullCount
  • List.Transform
  • Text.Contains
  • List.Sum
  • List.Accumulate
  • List.Combine
  • List.TransformMany
  • List.Generate
  • Text.Middle
  • List.AllTrue
  • List.ContainsAll
  • List.Union
  • List.Distinct
  • List.MatchesAll
  • List.Skip
  • List.RemoveMatchingItems
  • List.RemoveItems
  • Text.Remove
       其中相对复杂的函数是List.Accumulate和List.Generate,还有些用法或概念上比较类似的函数,比如List.RemoveMatchingItems和List.RemoveItems,List.MatchesAll和List.AllTrue等,这些我后续会用更多案例进行分享。

TA的精华主题

TA的得分主题

发表于 2018-7-31 09:09 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-7-31 09:33 | 显示全部楼层
wdx223 发表于 2018-7-31 09:09
黄老师又放大招啦

实际大多都是一些基础的常用函数。:)

TA的精华主题

TA的得分主题

发表于 2019-3-8 09:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-3-11 07:59 | 显示全部楼层
POWER QUERY以前没有接触过,看了黄大师的佳作,学到很多新东西。

TA的精华主题

TA的得分主题

发表于 2020-5-24 20:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
还是看的头大..慢慢学习

TA的精华主题

TA的得分主题

发表于 2020-5-25 09:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
PQ优化写法参考(看到N个新增自定义列,感觉都不好了
QQ截图20200525092930.png

PQ-M及函数:1个问题-15中解法-22个常用函数.rar

93.74 KB, 下载次数: 27

TA的精华主题

TA的得分主题

发表于 2020-5-25 11:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 libo5563 于 2020-5-25 11:53 编辑
deadzlq 发表于 2020-5-25 09:31
PQ优化写法参考(看到N个新增自定义列,感觉都不好了)

偷懒了吧,表2第2行 只匹配出 鞋   子   男  3个字 只能算 33%的匹配吧,自己电脑被占了,现在电脑没有pq,我的思路,表2每个单元格套2层acc,一层定位置,一层定长度,从前往后取,一个字的列,2个字的列,3个字的列...... 所有列里匹配的筛出来,找最长的,算匹配度.    (最长的词如果有多个,再处理太烧脑了,写不下去了,逻辑有点乱了)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-25 08:35 , Processed in 0.053105 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表