第一次出现负数的列

有如下表格1,第二列到第十一列的名称为MB1,MB2,……,M10。现在需要在每一行中寻找出第一次出现负数的列并在计算列1stMB中显示出该列的名称,最终效果如表格2所示。

表格1
表格2

因为最终目的为添加计算列显示每一行中第一次出现负数的列名称,需要使用如下以Table.AddColumn()为主体的函数组合(以下Power Query对象Data对应表格1):

let
    Add_Col =
        Table.AddColumn(
            Data,
            "1stMB",
            (x)=˃
                Table.FirstValue(
                    Table.RemoveFirstN(
                        Record.ToTable(
                            x
                        ),
                        (y)=˃ y[Value] ˃= 0
                    )
                ),
            type text
        )
in
    Add_Col

Table.AddColumn()会把表格1的每一行以记录(Record)为单位传入Record.ToTable(),被传入的记录在Record.ToTable()的作用下会转化为如下图所示的内嵌表格(下图对应表格1中的第7行):

之后,Table.RemoveFirstN()会把上图红色方框圈中的行移除,结果如下所示:

从上图中,不难发现以上表格左上角的值就是计算列在当前行所需要显示的值,所以最后一步需要使用Table.FirstValue()取出该值。如果使用List.Generate()进行求解,所需的运行时间较少但是代码会显得稍微复杂,有兴趣的读者可以查阅附件中的Final Solution2.xlsm附件。

附件

11 Replies to “第一次出现负数的列”

  1. Table.AddColumn(Source,"1stMB",each Table.ColumnNames(Source){List.Count(List.FirstN(Record.ToList(_),each _>=0))})

  2. = Table.AddColumn(a,"name",(x)=>Table.ColumnNames(a){List.PositionOf(List.Transform(List.Skip(Record.ToList(x)),(y)=>Number.Sign(Number.From(y))),-1)+1})

  3. Table.add column (表,”列名”, each list.transform({[mb1],[mb2],[mb3],[mb4], ..[mb10],(m)=> if m<=0 then table.columnnames(表[_]) else null)))

    1. 已添加自定义 = Table.AddColumn(更改的类型, "自定义", each List.PositionOfAny(List.Transform({[MB1],[MB2],[MB3],[MB4],[MB5],[MB6],[MB7],[MB8],[MB9],[MB10]},(m)=>if m<=0 then 1 else null),{1})),

      已添加自定义1 = Table.AddColumn(已添加自定义, "自定义.1", each List.Skip(Table.ColumnNames(已添加自定义))),
      已添加自定义2 = Table.AddColumn(已添加自定义1, "自定义.2", each [自定义.1]{[自定义]})

  4. 利用有限的知识做出来的,楼上好多用法还不会,(⊙o⊙)…,继续学习
    = Table.AddColumn(Source, "1stMB", each try Table.ColumnNames(Source){List.PositionOf(List.Transform(Record.ToList(_), each if _ 0" )

  5. let
    源 = Csv.Document(File.Contents("D:\015 提取第一次出现负数\Data3.csv"),[Delimiter=",", Columns=11, Encoding=936, QuoteStyle=QuoteStyle.None]),
    提 = Table.PromoteHeaders(源, [PromoteAllScalars=true]),
    b = Table.AddColumn(提, "b", each (Table.ColumnNames(提){List.PositionOf(Record.ToList(_), List.Select(Record.ToList(_),(x)=>Number.FromText(x)<0){0})}))
    in
    b

  6. = Table.AddColumn(源, "自定义", each [a=Record.ToTable(_),b=List.First(Table.Skip(a,(x)=>x[Value]>=0)[Name])][b])

  7. 这个可以避免全部正数错误
    = Table.AddColumn(源, "自定义", each [a=Record.ToTable(_),b=List.First(Table.Skip(a,(x)=>x[Value]>=0)[Name]) ?? null][b])

发表回复

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