如何通过条件判断(对相对位置行列值的比较)构建自定义规则的索引列?

Power Query 史努比 ⋅ 于 2018-09-24 12:09:56 ⋅ 最后回复由 史努比 2018-09-24 20:55:02 ⋅ 3142 阅读

各位老师好,
最近遇到问题如下。试图抓取某卫生洁具品牌官网,每个具体商品型号信息并汇总成表。
不同商品除了具体型号外,在各自的技术特性上,分别又有支持1~5项特殊亮点。
经过繁杂处理后,已经获得一个页面上所有商品(20个)对应的所有技术特性的文字短语列表。

从人工角度,很容易理解是,每个从”智洁技术“开头的若干词语,属于同一个商品具备的亮点;因此,我希望根据下表左侧的情况,通过索引列的辅助,生成右侧最终的索引顺序列,便于我进一步将相关技术特性,合并在同一个商品下。

file

但是使用Table.AddColumn时,对于 each和"_" 的使用,都比较混乱。
总是写不对,还望大侠出手指点!

已添加自定义 = Table.AddColumn(已添加索引, "新序列", if each _[功能亮点]=[功能亮点]{_-1} if true then 已添加索引{[索引]-1}[索引]+1 else  已添加索引{[索引]-1}[索引])
成为第一个点赞的人吧 :bowtie:
最佳答案
  • 飞天篮球 Talk is cheap, show me your code.
    2018-09-24 15:19:26
    Solution 1: Table.Group
    
    let
        源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],              
       分组 = Table.Group(源,"功能亮点",{"f",each _},0,(x,y)=>Number.From(x=y)),  
       添加索引 = Table.AddIndexColumn(分组[[f]], "新序列", 1),
       展开 = Table.ExpandTableColumn(添加索引, "f", {"功能亮点"})
    in   
       展开
    
    ++++++++++++++++++++++cut-off line+++++++++++++++++++++++
    
    Solution 2: List.Accumulate
    
    let
    
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    结果 = #table({"功能亮点","新序列"},
                                   List.Skip(List.Accumulate(源[功能亮点],
                                                                {{"",0}},
                                                                 (s,c)=>if c="智洁技术"
                                                                        then s&{{c,List.Last(s){1}+1}}
                                                                        else s&{{c,List.Last(s){1}}})
                                              )
                 )
    in
    
    结果
回复数量: 4
  • 飞天篮球 Talk is cheap, show me your code.
    2018-09-24 15:19:26
    Solution 1: Table.Group
    
    let
        源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],              
       分组 = Table.Group(源,"功能亮点",{"f",each _},0,(x,y)=>Number.From(x=y)),  
       添加索引 = Table.AddIndexColumn(分组[[f]], "新序列", 1),
       展开 = Table.ExpandTableColumn(添加索引, "f", {"功能亮点"})
    in   
       展开
    
    ++++++++++++++++++++++cut-off line+++++++++++++++++++++++
    
    Solution 2: List.Accumulate
    
    let
    
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    结果 = #table({"功能亮点","新序列"},
                                   List.Skip(List.Accumulate(源[功能亮点],
                                                                {{"",0}},
                                                                 (s,c)=>if c="智洁技术"
                                                                        then s&{{c,List.Last(s){1}+1}}
                                                                        else s&{{c,List.Last(s){1}}})
                                              )
                 )
    in
    
    结果
  • 史努比 PQ 初学者,EXCEL重度患者
    2018-09-24 17:49:33

    @飞天篮球 非常谢您的指导!

    我正在学习理解第一个方法。结果是对的。但是在公式上,我想请您给一些更具体的解释,因为我有点不太理解在这里:
    1. 分组 = Table.Group(源,"功能亮点",{"f",each _},0,(x,y)=>Number.From(x=y)),
    我理解,是从原始表,按照”功能亮点“列来做分组聚合,但是第三个参数是
    [aggregatedColumns]: Specifies the names and function return types. 确定聚合列名称和函数返回类型。
    这里 each _ 是函数返回类型的意思吗?
    后面第四个参数=0,代表什么意思呢?
    第五个参数是一个函数,x和y两个变量输入后,得到x和y相等时的值——但x和y是谁呢?如何输入的?相等后又如何赋值呢?

    2. 添加索引 = Table.AddIndexColumn(分组[[f]], "新序列", 1),
    这段我理解是添加一个索引列。我尝试比较了 分组[[f]]和 分组[f]的两种写法,前者是分组这个表格,后者是一个list。
    为什么表达一个table的方法是 分组[[f]],而不是分组[f]呢?两层中括号嵌套的用法,是官方的表达式吗?

  • 飞天篮球 Talk is cheap, show me your code.
    2018-09-24 20:24:21

    @史努比

    这个一时半会儿也解释不清楚,看你有心就随便聊几句吧。请看后边的注释:

    1. 分组 = Table.Group(源,"功能亮点",{"f",each _},0,(x,y)=>Number.From(x=y)),
    这里 each _ 是函数返回类型的意思吗?
    这部分的意思是分组后生成的表,下划线_表示分组后f列中的每一个table,f可以随意命名,好区分就行。下划线可以进一步处理,本案例中不需要

    后面第四个参数=0,代表什么意思呢?
    第五个参数是一个函数,x和y两个变量输入后,得到x和y相等时的值——但x和y是谁呢?如何输入的?相等后又如何赋值呢?
    第四参数0表示局部分组,第五参数表示的是用什么样的条件来进行分组。本案例中,x表示“功能亮点”这一列分组依据中的第一个值,其它的值都视作y,然后以x=y为标准去判断,如果true就截断,然后重新开始xy判断截取...。这个一开始有点不怎好理解,自己要多比划比划,具体可以参考畅心大神关于局部分组的原创文章:https://pqfans.com/836.html

    2. 添加索引 = Table.AddIndexColumn(分组[[f]], "新序列", 1),
    这段我理解是添加一个索引列。我尝试比较了 分组[[f]]和 分组[f]的两种写法,前者是分组这个表格,后者是一个list。 为什么表达一个table的方法是 分组[[f]],而不是分组[f]呢?两层中括号嵌套的用法,是官方的表达式吗?
    [[]]这样的写法是深化表格中某一列为表格的一种方法,常规的 表[列] 这样的写法是把表中的列深化成list。而 表[[列]] 这样的写法是把表中的列依然深化成一个表,你也可以深化出其中的多列,比如,表[[列1],[列2],...],意思就是留下了表中需要的部分,跟Table.SelectColumns、Table.RemoveColumns差不多的效果,只是写法比较撩骚。这种深化方法同样适用于record,你可以自己写个record,然后 record[[field]] 或者 record[[field1],[field2],...]。至于是不是官方写法我也不知道,我是从畅心大神那里学来的。

    就说这么多吧,纸上得来终觉浅,日后有案例可以再交流。

  • 史努比 PQ 初学者,EXCEL重度患者
    2018-09-24 20:55:02

    @飞天篮球 不知道怎么表达感谢大侠。这个论坛的互助气氛实在是太好了。希望后续我也能这样为论坛做出贡献。

暂无评论~~
  • 请务必阅读并严格遵守《社区管理规范与使用说明》
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 发送表情,可用的 Emoji 见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板粘贴上传, 格式限制 - jpg, png, gif
  • 不支持上传附件,请尽可能用文字和图片将问题描述清楚,如实在需要上传附件,可上传到 共享网盘 后分享链接
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
Ctrl+Enter