Power BI中用DAX统计网络连接数并过滤单连接节点
Power BI 网络图过滤孤立1对1连接节点方案
问题背景
在Power BI中有一份包含Participant ID(参与者ID)和Knows Participant(认识的参与者)的数据集,已基于此构建网络图,但图中大量1对1的无价值连接节点需要排除。
用户尝试的DAX计算列仅统计Knows Participant列的重复值,无法准确获取每个网络的连接数:
Connection Column = COUNTROWS( FILTER(Table, EARLIER(Table[Knows Participant])=Table[Knows Participant]) )
需求是统计每个网络的连接数,并过滤仅含1个连接的节点,期望输出示例:
| 参与者ID | 认识的参与者 | 所在网络的连接数 |
|---|---|---|
| 111 | 353 | 4 |
| 353 | 444 | 4 |
| 444 | 551 | 4 |
| 551 | 987 | 4 |
| 112 | 143 | 1 |
| 220 | 190 | 1 |
| 333 | 337 | 2 |
| 337 | 410 | 2 |
| 765 | 0 |
解决方案
核心是先识别每个参与者所属的连通组件(即网络),再统计组件的总连接数,具体步骤如下:
步骤1:创建完整参与者列表
先生成包含所有参与者的表(覆盖仅出现在Participant ID或Knows Participant中的个体):
All Participants = DISTINCT( UNION( SELECTCOLUMNS('Table', "ID", 'Table'[Participant ID]), SELECTCOLUMNS('Table', "ID", 'Table'[Knows Participant]) ) )
步骤2:标记连通组件(网络ID)
在All Participants表中新建计算列,用路径函数识别每个参与者所属的网络:
Network ID = VAR CurrentID = [ID] VAR PathToRoot = PATH('Table', 'Table'[Participant ID], 'Table'[Knows Participant]) VAR RootID = PATHITEM(PathToRoot, 1) RETURN RootID
注:如果连接是双向的(A认识B则B也认识A),需先确保数据集包含双向记录,避免组件识别错误。
步骤3:计算所在网络的连接数
在原数据表中新建计算列,关联获取当前参与者的网络ID后,统计该网络的总连接数:
所在网络的连接数 = VAR CurrentParticipant = 'Table'[Participant ID] VAR CurrentNetwork = LOOKUPVALUE('All Participants'[Network ID], 'All Participants'[ID], CurrentParticipant) VAR NetworkConnections = CALCULATE( COUNTROWS('Table'), FILTER( ALL('Table'), LOOKUPVALUE('All Participants'[Network ID], 'All Participants'[ID], 'Table'[Participant ID]) = CurrentNetwork ) ) RETURN IF(ISBLANK('Table'[Knows Participant]), 0, NetworkConnections)
步骤4:过滤节点
在网络图的视觉对象筛选器中,添加条件:所在网络的连接数 > 1,即可排除1对1连接的节点。
双向连接场景简化方案
如果连接是双向的,可直接统计每个参与者的关联数,再过滤关联数≤1的节点:
关联数 = CALCULATE( COUNTROWS('Table'), OR( 'Table'[Participant ID] = EARLIER('Table'[Participant ID]), 'Table'[Knows Participant] = EARLIER('Table'[Participant ID]) ) )
筛选条件设为关联数 > 1即可。
内容的提问来源于stack exchange,提问作者Vlad Fedo
相关产品推荐
相关产品推荐

