如何把字段数量不固定的数据段,转换为整齐的透视列?

Power Query 史努比 ⋅ 于 2018-11-07 16:48:35 ⋅ 最后回复由 klzb 2018-11-08 15:23:35 ⋅ 2816 阅读

file

在抓取京东的螺丝刀页面的商品信息,便于后续筛选价格。
已经通过PQ 整理成如上样子,但现在如果直接建立索引列的话,会发现每一个商品信息的字段可能是6行、7行、8行……每个信息段的首行都是以¥开始的,但其中字段信息不确定在有的会增几行描述为“电动螺丝刀”、“工具”……这就导致根据递增索引去建立取模序列再做 透视列的方案行不通,因为并不是每一行都是固定的一个序列差。

想请教这种情况该怎么进一步数据清晰整理呢?谢谢!

成为第一个点赞的人吧 :bowtie:
最佳答案
  • 飞天篮球 Talk is cheap, show me your code.
    2018-11-08 08:40:42

    @史努比

    fyi...新建一个空白查询,点高级编辑器,清空,然后复制粘贴以下内容,看一下运行结果是不是你想要的动态扩展列。

    let
    
        // 模拟一个带有tablecolumn的数据源表
    
        src   = #table( {"seq","tbl"}, { {1,#table(1,{{1}})},
                                         {2,#table(2,{{1..2}})},
                                         {3,#table(3,{{1..3}})},
                                         {4,#table(4,{{1..4}})},
                                         {5,#table(5,{{1..5}})} } ),    
    
        // List.Union这部分表示动态最大列数
    
        expnd = Table.ExpandTableColumn( src, 
                                         "tbl", 
                                         List.Union(
                                                    List.Transform(src[tbl],Table.ColumnNames)   
                                                    ) 
                                        )                               
    
    in
        expnd
回复数量: 4
  • Alex MOD 社区清洁工
    2018-11-07 17:44:51

    需求应该就是个 Table.Group 局部分组吧,参考 https://pbihub.cn/blog/123

  • 史努比 PQ 初学者,EXCEL重度患者
    2018-11-07 21:46:46

    @Alex 是的,现在感受非常深刻,如果每一组数据的字段数量完全一致,则可以使用建立索引列/取模列,来完成透视表的方式;如果每一组的数据字段数量不完全一致,则可以先用 table.group 将同一个系列下的若干字段压到一个table里去,然后对这一新列的每个table,再做一次转置 table.transpose,再展开每一列,就可以获得想要的排版。

    这里还要提醒的是,展开列的时候,如果是手动操作,会导致展开的column数量是跟随第一个table里的量,而如果后面的table里的column数量更多,那么PQ的公式语句里就会丢掉后面的columns,我目前的办法是先数出最多的column数量,比如是COLUMN8,那么对整列里每个table都expand时按8个列去写列名,这样如果多的列没有内容就是null,后续再合并列处理,否则直接展开就会丢掉一些列。
    ——就这个问题有么有更自动的办法呢?

  • 飞天篮球 Talk is cheap, show me your code.
    2018-11-08 08:40:42

    @史努比

    fyi...新建一个空白查询,点高级编辑器,清空,然后复制粘贴以下内容,看一下运行结果是不是你想要的动态扩展列。

    let
    
        // 模拟一个带有tablecolumn的数据源表
    
        src   = #table( {"seq","tbl"}, { {1,#table(1,{{1}})},
                                         {2,#table(2,{{1..2}})},
                                         {3,#table(3,{{1..3}})},
                                         {4,#table(4,{{1..4}})},
                                         {5,#table(5,{{1..5}})} } ),    
    
        // List.Union这部分表示动态最大列数
    
        expnd = Table.ExpandTableColumn( src, 
                                         "tbl", 
                                         List.Union(
                                                    List.Transform(src[tbl],Table.ColumnNames)   
                                                    ) 
                                        )                               
    
    in
        expnd
  • klzb
    2018-11-08 15:23:35

    取字段,合并,去重

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