如何按分组将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
相关产品推荐
相关产品推荐

