Table.ReplaceValue 替换重复ID案例

本期案例是将重复出现的ID进行替换,对应的值为ALT_ID的值,前后转换效果如下:

解题套路

(一)Table.ReplaceValue

1.首先获取当前行对应的位置,通过位置获得包括当前行之前的数据。

深化ID列,筛选与当前行ID相同的项并统计,判断的依据是统计的个数是否为1,个数为1的不变,其他进行替换。

Table.ReplaceValue(源,each [ALT_ID],each List.Count(List.Select(Table.FirstN(源,Table.PositionOf(源,_)+1)[ID],(x)=>x=[ID]))=1,(x,y,z)=>if z then x else y,{"ID"})

2.本案例是对ID的唯一性进行判断,因此这里不需要进行上述相同ID的筛选,只要截取不包括当前行的数据,判断的依据就变成了深化后ID列是否包含当前行ID,包含则进行替换,否则不变。

Table.ReplaceValue(源,each [ALT_ID],each List.Contains(Table.FirstN(源,Table.PositionOf(源,_))[ID],[ID]),(x,y,z)=>if z then y else x,{"ID"})

3.另外一种方式也可以扩展下。对源添加索引列,然后依据ID进行分组,对于索引值非最小的ID进行替换,其他保持不变。

Table.RemoveColumns(Table.Sort(Table.Combine(Table.Group(Table.AddIndexColumn(源,"index"),"ID",{"a",each Table.ReplaceValue(_,each [ALT_ID],each [index],(x,y,z)=>if z=List.Min([index]) then x else y,{"ID"})})[a]),"index"),"index")

使用索引可以保持源数据的排序,如果不考虑这个,也可以直接使用位置函数进行转换。

(二)List.Accumulate

该思路与前述唯一性判断类似,ACC第二参数为列表,对应的第二项为ID库,当出现不唯一的时候,对传递的列表进行ID值替换,否则不变。

Table.FromRows(List.Accumulate(Table.ToRows(源),{{},{}},(x,y)=>if List.Contains(x{1},y{0}) then {x{0}&{List.ReplaceRange(y,0,1,{List.Last(y)})},x{1}} else {x{0}&{y},x{1}&{y{0}}}){0},Table.ColumnNames(源))

以上是本期内容。

展开阅读全文

页面更新:2024-06-01

标签:案例   套路   本期   函数   个数   最小   索引   位置   数据   列表

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top