手写识别算法卷积 BI中生成笛卡尔积(1)

假如分别有100个不重复的姓和名,把每个姓和名进行组合匹配,就可以得到一万个不重复的姓名组合,这种完全匹配的方式就是生成一个姓名的笛卡尔积。

下面就来看看生成笛卡尔积的几种方式,为了展现的方便,以5个姓和5个名为例,更多的数据也是一样操作的。

在Excel中生成笛卡尔积

在Excel中可以利用INDEX函数实现,假如A列是姓,B列是名,那么在C2中输入公式:

C2=INDEX(A:A,INT((ROW(A2)-2)/(COUNTA(B:B)-1)) 2)&INDEX(B:B,MOD(ROW()-2,COUNTA(B:B)-1) 2)

然后公式向下填充,就可以在C列生成笛卡尔积。

手写识别算法卷积 BI中生成笛卡尔积(2)

在Power Query中生成笛卡尔积

在PQ中相比Excel要简单的多,假如有两个表,'姓'和'名',操作步骤如下,

手写识别算法卷积 BI中生成笛卡尔积(3)

↑添加辅助列,值设置为1(或其他任何值)

手写识别算法卷积 BI中生成笛卡尔积(4)

↑合并查询-按辅助列-完全外部联结

手写识别算法卷积 BI中生成笛卡尔积(5)

↑展开合并查询

手写识别算法卷积 BI中生成笛卡尔积(6)

↑合并列

通过简单的点击操作,就生成了一个笛卡尔积,虽然看起来步骤很多,其实就是秒秒钟的事。

使用DAX生成笛卡尔积

依然假设已经有两个表,'姓'和'名',在【建模】选项卡下点击"新表",输入,

姓名 = GENERATE('姓','名')

手写识别算法卷积 BI中生成笛卡尔积(7)

二者逐一匹配的笛卡尔积的结果就出来了,这里GENERATE函数还可以使用CROSSJOIN替代,效果是一样的。

当然我们并不想要姓和名分开为两列,而是想直接得到姓名合并的结果,可以用ADDCOLUMNS把这两列合并,再利用SELECTCOLUMNS函数提取出需要的列,把公式改为,

表=SELECTCOLUMNS(ADDCOLUMNS(CROSSJOIN('姓','名'),"姓名",[姓]&[名]),"姓名",[姓名])

一步实现最终结果,

手写识别算法卷积 BI中生成笛卡尔积(8)

总结

以上三种方式操作起来都不难,数据处理虽不是DAX的长处,但也可以简单实现,学会这几个DAX函数,以后在数据分析时可以灵活构建度量。

当然在Power Query中最简单的,数据处理本来就是PQ的核心功能,这个案例中无需任何代码或者公式,只是通过简单的界面操作,就可以轻松完成。

在Excel中虽然也仅需一个公式,但能灵活使用INDEX函数的都是高手级的,能达到这个水平的人少之又少,大部分人看到这个公式可能也不理解,并且如果数据量较大,通过Excel处理速度也会变得很慢。

所以说学习Power Query可以让你在数据处理上弯道超车,轻松逆袭,之前在Excel中很难处理,或者需要用到各种稀奇古怪函数才能得到的结果,在PQ中都显得毫不费力。

公众号回复“PowerBI”,获取145页PowerBI入门电子书,新的一年,送自己一个技能!

the end

.

,