如何在NetworkX中按年份分组计算各ID的年度连接总数
解决方案
方案1:纯Pandas实现(性能最优,仅统计连接数首选)
你的需求本质是统计每个ID每年对应的无向边度数,无需构建完整图结构,直接通过数据重塑+分组统计即可实现,性能远高于循环建图,百万级数据可在数秒内完成计算:
import pandas as pd # 你的样例数据 d = {'ID1': [21, 21, 21, 21, 21], 'ID2': [343252, 44134, 41314, 161345, 89479],'year': [2010, 2010, 2010, 2011, 2011]} df = pd.DataFrame(data=d) # 第一步:同一年同一对ID去重,和NetworkX图的边去重逻辑保持一致 df = df.drop_duplicates(subset=['ID1', 'ID2', 'year']) # 第二步:将两列ID转为长格式,把ID1、ID2合并到同一列 df_long = pd.melt(df, id_vars=['year'], value_vars=['ID1', 'ID2'], value_name='ID') # 第三步:按年份+ID分组计数,结果即为对应年份的总连接数 yearly_conn = df_long.groupby(['year', 'ID'], as_index=False)['variable'].count().rename(columns={'variable': 'connections'}) # 可按需求排序 yearly_conn = yearly_conn.sort_values(['year', 'connections'], ascending=[True, False])
输出结果和你按年份分别建图得到的结果完全一致。
方案2:分组调用NetworkX(需额外图计算时使用)
如果你后续还需要基于每年的图计算其他指标(比如中心性、聚类系数等),可以用pandas groupby的apply方法统一处理,比手动循环筛选数据效率更高:
import pandas as pd import networkx as nx d = {'ID1': [21, 21, 21, 21, 21], 'ID2': [343252, 44134, 41314, 161345, 89479],'year': [2010, 2010, 2010, 2011, 2011]} df = pd.DataFrame(data=d) df = df.drop_duplicates(subset=['ID1', 'ID2', 'year']) def calc_year_graph_metrics(group): G = nx.from_pandas_edgelist(group, 'ID1', 'ID2') # 可在此处添加其他图指标计算逻辑 return pd.DataFrame({'ID': list(G.nodes), 'connections': [d for n, d in G.degree()]}) yearly_conn = df.groupby('year', group_keys=False).apply(calc_year_graph_metrics).reset_index(drop=False)
结果写入数据库
直接使用pandas内置的to_sql方法批量写入即可,以MySQL为例:
from sqlalchemy import create_engine # 初始化数据库连接引擎,按自己的数据库类型修改连接串 engine = create_engine('mysql+pymysql://用户名:密码@地址:端口/库名?charset=utf8mb4') # 批量写入数据库,if_exists可指定为append/ replace/ fail yearly_conn.to_sql(name='yearly_id_connections', con=engine, if_exists='append', index=False)
内容的提问来源于stack exchange,提问作者shinama99
相关产品推荐
相关产品推荐

