PowerQuery中動態(tài)改變列值的幾種方法

在PowerQuery中,我們經(jīng)常需要動態(tài)改變一列的值。我知道的有兩種情形:
1.在不涉及表格中的其他列的情況下改變列值;
2.基于表格的其他列的值,動態(tài)改變列值。

而常見的方法也有兩種:
1.通過新增列來實現(xiàn)改變列值,這是最直觀的方法。很容易通過UI就完成任務(wù)了。缺點是新增了列,可能還需要刪除不需要的列。
2.通過列變換來實現(xiàn)改變列值,而不需要新增列。

由于通過新增列改變列值的方法最簡單最直觀,因此不作演示。

本文主要羅列幾種不需要新增列就能改變列值的方法。這些方法都不是我原創(chuàng),不過可能加入了一點我自己的思考。

示例表格如下:


示例表格

要求將性別(必填項)的值變?yōu)樾詣e列對應(yīng)的值,同時保留兩行并不增加新的行。

方法一:Table.ReplaceValue()替換

  = Table.ReplaceValue(源,each [#"性別(必填項)"],each [性別],Replacer.ReplaceValue,{"性別(必填項)"})

方法二:Table.FromRecords()結(jié)合Table.TransformRows()和Record.TransformFields()

Table.FromRecords(Table.TransformRows(源,(row)=>Record.TransformFields(row,{"性別(必填項)", each row[性別]}))) 

這兩種方法均來源于:https://bondarenkoivan.wordpress.com/2016/12/12/transform-column-using-custom-function-in-power-query-part-2/#more-1033
其中方法二來源于正文,方法一來源于該文讀者的評論。我將方法一排列在前面,是因為我認(rèn)為方法一最簡潔。

這里我殺個回馬槍,當(dāng)我們想到列變換的時候,腦子里首先想到的是Table.TransformColumns()函數(shù),為什么不用它來實現(xiàn)動態(tài)變換呢?

事實上Table.TransformColumns()函數(shù)確實能解決大部分列變換的問題,但是它唯獨(dú)搞不定要動態(tài)引用其他列對應(yīng)值來進(jìn)行相關(guān)計算的問題。這也是為什么來源作者IVAN BONDARENKO絲毫沒有提及這個函數(shù)的緣故。

PowerBI社區(qū)中,MarcelBeug提到,“With Table.TransformColumns, it is not possible to reference other columns.我之前不知道有這個緣故,套用Table.AddColumn()的方法,引用列名:

= Table.TransformColumns(設(shè)置性別,{"性別(必填項)",each [性別]})

總是提示“Expression.Error: 無法對類型 Text 應(yīng)用字段訪問”的錯誤。

那為什么方法一的Table.ReplaceValue()卻可以引用列名呢?奧秘就在微軟官方對這兩個函數(shù)的官方解釋上。

Table.ReplaceValue()的官方解釋是:

Table.ReplaceValue(table as table, oldValue as any, newValue as any,replacer as function, columnsToSearch as {Text}) as table

Table.TransformColumns()的官方解釋是:

Table.TransformColumns(table as table, transformOperations as list, optional defaultTransformation as nullable function, optional missingField as nullable number) as table

可以看到Table.ReplaceValue()的兩個參數(shù)都是“any”類型,而Table.TransformColumns()的主要參數(shù)是“l(fā)ist”。那我能不能猜想,凡是參數(shù)是“any”類型,就可以自由引用列名,如果不是就不能呢?

我找到了Table.FirstN(),可選參數(shù)的type是“any”:

Table.FirstN( table as table, optional countOrCondition as any) as table  

我測試引用列名:

= Table.FirstN(設(shè)置性別,each [性別]="女")

結(jié)果如下:

Table.FirstN()

所以我推測如下:如果函數(shù)參數(shù)type是“any”,就可以自由引用列的內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容