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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:24:07