Table.TransformColumns

官方说明:

通过对在参数transformOperations中指定的列应用转换操作(其中格式为{column name,transformation}),从输入table中返回一个表。如果此列不存在,将引发异常,除非可选参数defaultTransformation指定备用值(例如, MissingField.UseNull或MissingField.Ignore)。
Table.TransformColumns( table as table, transformOperations as list, optional defaultTransformation as nullable function, optional missingField as nullable number) as table

解读:


将体育分数每个人加5分,不要问我为什么,因为这些人是皇亲国戚!= Table.TransformColumns(源,{"体育",each _+5})
简单的理解哈这个_指代了当前指定的体育列对象,针对对象进行转换!当然你可以对_进行扩展,比如{_,_}或者{_,null}甚至是文本对象的拆分,总之你可以对这个单值嵌套其他任意你需要转换的内置或自定义函数!

我们可以想象他可以干啥,当只有一列数据时我们可以用来转换数据类型、插入空格、重复对象拉伸,甚至做一些条件判断…
比如将体育成绩低于60的成绩转换成不及格、大于等于60分的成绩转换成及格= Table.TransformColumns(源,{"体育",each if _<60 then "不及格" else "及格"})

将化学成绩转换为百分比格式:
= Table.TransformColumns(源,{"化学",each Number.ToText(_,"p0")})

当然你也可以写为:= Table.TransformColumnTypes(表,{"化学",Percentage.Type})
有人就急了追问,那我要调整两列咋办?很简单每个列表定义一组调整方式,然后把所有列表放一个大列表下即可!
例如:= Table.TransformColumns(源,{{"化学",Text.From},{"体育",each _+5}})

老实的同学才不听你扯,他们还是从语法一步一步来,一瞄参数貌似可以写四个,并且知道第一参数写表,第二参数是list结构,第三参数是个函数,第四参数是对缺失引用的调整!
还是老规矩测试哈三个参数先,试一下特殊情况第二参数是空列表的返回啥?
= Table.TransformColumns(源,{},each _+2)

我们发现第一列文本出错了,出错理由是文本无法与数字相加,其余列全部加上了2,我的理解第三参数转化的是除开第二参数序列里面定义的列之外的所有列的转换操作。这里第二参数是空的,那么第三参数直接对所有列进行了转换,测试哈以下情况验证猜想!= Table.TransformColumns(源,{"姓名",each "中华1班-"&_},each _+2)

当然你可以在第二参数多限定几列进行特定转换操作,其余的列怎么统一调整就交给第三参数吧!= Table.TransformColumns(源,{{"姓名",each "中华1班-"&_},{"化学",each _*100}},each _+2)

第四参数有人很费解,甚至会问我用得到吗?
= Table.TransformColumns(源,{{"姓名",each "中华1班-"&_},{"组别",each "东方红"&_}},each _+2,2)

观察发现本来数据源没有组别这一列,非要调整的话你得给出第四参数,这里给了一个2,什么意思,就是当需要调整的列不存在时加上一列null值的空列,写1的话就是直接忽略!好处就是当我们处理的对象是一组表时,有些表的表头部分字段可能有缺失就可以统一调整!很多时候我们希望通过同行的不同列的值进行条件判断从而确定当前列值的转换操作时,不要想当然用这个函数,那是Table.TransformRows干的活,他才能关联同行不同列的值关系!对于Table.TransformRows不再赘述、只需考虑处理对象是记录且结果是序列形式即可!

10 Replies to “Table.TransformColumns”

  1. Hello,
    我试图灵活控制第二参数的列名称。于是在其他表里做了一个含特定列名称的list, 并将List name放在第二参数位置,但PQ不工作并显示以下提示,请教是何原因

    Expression.Error: There weren't enough elements in the enumeration to complete the operation.
    Details:
    List

      1. 以下是我的Code, 我该如何提供源文件?

        let

        /*分两部分,第一部分准备参数,第二部分将参数用于调整表文件*/
        //第一段,获取变量

        Source1 = Excel.CurrentWorkbook(){[Name="Title"]}[Content],
        Title1 = {Table.ToRecords(Table.Transpose(Table.Buffer(Source1))){2}},//用于替换下表列名称
        SelectCol = List.Transform(Table.SelectRows(Source1, each ([Operation] = "Keep"))[Value2],{_} ),//用于第二部分List.Transform第二参数

        //第二段,整理表文件
        Source2 = Excel.CurrentWorkbook(){[Name="Path"]}[Content],
        #"Added Custom" = Table.AddColumn(Source2, "Tables", each Table([Path])),
        Custom1 = Table.Combine(#"Added Custom"[Tables]),
        Custom2 = Table.InsertRows(Custom1,0,Title1),//切除原列名称,替换为Title1
        #"Promoted Headers" = Table.PromoteHeaders(Custom2, [PromoteAllScalars=true]),
        Custom3 = Table.TransformColumns(#"Promoted Headers",{SelectCol}, each Text.Remove(_,{"Z".."a"," "})) //清洗剩余列的字符(做不下去了)

        in
        Custom3

  2. 我的问题出在对Table.TransformColumns第二参数的理解有问题,它不是普通的列名List, 而是有特定形式{"列名称", each _}

    我还是完成了对特定列,批量删除特定字符集(即对表进行批量清洗)的方法

    = List.Accumulate({"CNY"," ","/KG","%","KG","X"},#"Promoted Headers",(x,y)=>Table.ReplaceValue(x,y," ",Replacer.ReplaceText,SelectCol)) 其中SelcetCol是指定列集合,不知道是否有更好方法。

    谢谢 BR/Vincent

  3. 请教老师一个问题:如果第二字段是要让原值加上另一列同一行的数该咋写呢?
    = Table.TransformColumns(已添加自定义, {{"小计", each _ + [其他], type number}})
    上述这种写法会报错:Expression.Error: 无法对类型 Number 应用字段访问。

  4. = Table.TransformColumns(源,{"化学",each Number.ToText(_,"p0")})

    这个地方您是怎么知道p0是代表百分比格式的?那其他的格式是怎么改呢?比如说两位小数?

    1. 根据 format 指定的格式,将数值 number 格式化为文本值。 格式是单个字符代码,后面可能带一个数字精度说明符。 以下字符代码可用于 format。
      “D”或“d”:(十进制)将结果格式化为整数。 精度说明符控制输出中的位数。
      “E”或“e”:(指数/科学)指数表示法。 精度说明符控制最大小数位数(默认值为 6)。
      “F”或“f”:(固定点)整数和小数位。
      “G”或“g”:(常规)固定点或科学记数法的最简洁形式。
      “N”或“n”:(数字)带组分隔符和小数分隔符的整数和小数位。
      “P”或“p”:(百分比)乘以 100 并显示百分号的数字。
      “R”或“r”:(往返)可往返转换同一数字的文本值。 将忽略精度说明符。
      “X”或“x”:(十六进制)十六进制文本值。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注