假如分别有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列生成笛卡尔积。
在Power Query中生成笛卡尔积
在PQ中相比Excel要简单的多,假如有两个表,'姓'和'名',操作步骤如下,
↑添加辅助列,值设置为1(或其他任何值)
↑合并查询-按辅助列-完全外部联结
↑展开合并查询
↑合并列
通过简单的点击操作,就生成了一个笛卡尔积,虽然看起来步骤很多,其实就是秒秒钟的事。
使用DAX生成笛卡尔积
依然假设已经有两个表,'姓'和'名',在【建模】选项卡下点击"新表",输入,
姓名 = GENERATE('姓','名')
二者逐一匹配的笛卡尔积的结果就出来了,这里GENERATE函数还可以使用CROSSJOIN替代,效果是一样的。
当然我们并不想要姓和名分开为两列,而是想直接得到姓名合并的结果,可以用ADDCOLUMNS把这两列合并,再利用SELECTCOLUMNS函数提取出需要的列,把公式改为,
表=SELECTCOLUMNS(ADDCOLUMNS(CROSSJOIN('姓','名'),"姓名",[姓]&[名]),"姓名",[姓名])
一步实现最终结果,
总结
以上三种方式操作起来都不难,数据处理虽不是DAX的长处,但也可以简单实现,学会这几个DAX函数,以后在数据分析时可以灵活构建度量。
当然在Power Query中最简单的,数据处理本来就是PQ的核心功能,这个案例中无需任何代码或者公式,只是通过简单的界面操作,就可以轻松完成。
在Excel中虽然也仅需一个公式,但能灵活使用INDEX函数的都是高手级的,能达到这个水平的人少之又少,大部分人看到这个公式可能也不理解,并且如果数据量较大,通过Excel处理速度也会变得很慢。
所以说学习Power Query可以让你在数据处理上弯道超车,轻松逆袭,之前在Excel中很难处理,或者需要用到各种稀奇古怪函数才能得到的结果,在PQ中都显得毫不费力。