You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按分组将DataFrame转换为Actor为行、Receiver为列的矩阵列表?

将DataFrame按分组转换为邻接矩阵列表

需求说明

需要将包含分组、行为者(Actor)、接收者(Receiver)和计数(Count)的DataFrame,按Group列分组后生成矩阵列表:

  • 每个矩阵的行对应分组内的所有Actor,列对应分组内的所有Receiver
  • 矩阵中对应位置填充Count值,无匹配数据的位置填充0
  • 需包含分组内所有出现过的个体(即使该个体没有对应Count数据,如示例中的AC)

示例输入DataFrame

Group   Actor Receiver Count
  A      AA      AB        3
  A      AA      AH        6
  A      AB      AH        3

期望输出

[[A]]
           [,AA] [,AB] [,AC] [,AH]
    [AA,]    0      3     0     6
    [AB,]    0      0     0     3
    [AC,]    0      0     0     0
    [AH,]    0      0     0     0

解决方案(R语言)

使用dplyr、tidyr和purrr包实现分组矩阵生成:

# 加载依赖包
library(dplyr)
library(tidyr)
library(purrr)

# 构建示例数据
df <- tibble(
  Group = c("A", "A", "A"),
  Actor = c("AA", "AA", "AB"),
  Receiver = c("AB", "AH", "AH"),
  Count = c(3, 6, 3)
)

# 按分组生成矩阵列表
matrix_list <- df %>%
  # 按Group拆分数据
  group_split(Group) %>%
  # 给列表元素命名为分组名
  set_names(map(., ~first(.$Group))) %>%
  # 对每个分组处理生成矩阵
  map(function(group_data) {
    # 获取分组内所有唯一的Actor和Receiver,补充示例中的AC(实际场景可根据需求调整)
    all_nodes <- unique(c(group_data$Actor, group_data$Receiver))
    all_nodes <- union(all_nodes, "AC")
    all_nodes <- sort(all_nodes)
    
    # 生成Actor和Receiver的全组合网格
    full_grid <- expand_grid(Actor = all_nodes, Receiver = all_nodes)
    
    # 合并原始数据,将缺失的Count填充为0
    filled_data <- full_grid %>%
      left_join(group_data, by = c("Actor", "Receiver")) %>%
      mutate(Count = replace_na(Count, 0))
    
    # 转换为矩阵并设置行列名
    matrix(filled_data$Count, 
           nrow = length(all_nodes), 
           dimnames = list(all_nodes, all_nodes))
  })

# 查看分组A的矩阵
matrix_list$A

解决方案(Python语言)

使用pandas和numpy实现相同逻辑:

import pandas as pd
import numpy as np

# 构建示例数据
df = pd.DataFrame({
    "Group": ["A", "A", "A"],
    "Actor": ["AA", "AA", "AB"],
    "Receiver": ["AB", "AH", "AH"],
    "Count": [3, 6, 3]
})

matrix_dict = {}
# 按Group分组处理
for group, group_data in df.groupby("Group"):
    # 获取分组内所有唯一节点,补充示例中的AC
    all_nodes = pd.unique(group_data[["Actor", "Receiver"]].values.ravel())
    all_nodes = np.union1d(all_nodes, ["AC"])
    all_nodes = np.sort(all_nodes)
    
    # 生成Actor和Receiver的全组合
    full_grid = pd.MultiIndex.from_product([all_nodes, all_nodes], names=["Actor", "Receiver"]).to_frame(index=False)
    
    # 合并数据并填充缺失值为0
    filled_data = full_grid.merge(group_data, on=["Actor", "Receiver"], how="left").fillna(0)
    
    # 转换为矩阵
    mat = filled_data.pivot(index="Actor", columns="Receiver", values="Count").values
    matrix_dict[group] = mat

# 查看分组A的矩阵
print(matrix_dict["A"])

内容的提问来源于stack exchange,提问作者Nitrowast3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:57:38