Python中CSV文件门间连接数累加:生成连接统计表
解决方案:累加门间连接数并生成统计表
这问题我处理类似数据时也碰到过,核心就是要先按(out_gate, in_gate)的组合对连接数做累加,再把累加结果映射到你需要的矩阵格式里。下面给你两种实用的实现方式:
方法一:基础Python实现(无需额外库)
这种方法适合不想引入第三方库的场景,用字典存储累加后的连接数,再生成目标表格:
步骤1:模拟/读取CSV数据并累加连接数
先把CSV数据读进来(这里用列表模拟,实际可以用csv模块读取文件),然后用字典记录每个(out, in)组合的总连接数:
# 模拟CSV数据行(实际可通过csv.reader读取本地文件) csv_rows = [ ['a','b',1], ['a','b',3], ['b','a',2], ['b','c',4], ['c','a',5], ['c','b',5], ['c','b',3], ['c','a',4] ] # 初始化字典存储累加后的连接数 connection_totals = {} for out_gate, in_gate, num in csv_rows: # 把CSV读取的字符串类型连接数转为整数 num = int(num) # 用(out_gate, in_gate)作为字典的唯一键 key = (out_gate, in_gate) if key in connection_totals: connection_totals[key] += num else: connection_totals[key] = num
步骤2:生成目标统计表
用你已有的listfile作为行和列的顺序,遍历每个组合填充数值(对角线设为0):
listfile = ['a','b','c'] # 打印表头(空字符串对应行首的out_gate标识列) print('\t'.join([''] + listfile)) # 遍历每个out_gate生成对应行数据 for out in listfile: row_values = [] for in_gate in listfile: if out == in_gate: # 对角线位置(自身到自身)设为0 row_values.append('0') else: # 从字典取累加值,无匹配则默认0 row_values.append(str(connection_totals.get((out, in_gate), 0))) # 打印当前行(out_gate + 对应数值) print('\t'.join([out] + row_values))
运行后就能得到你要的结果:
a b c a 0 4 0 b 2 0 4 c 9 8 0
方法二:用Pandas实现(更简洁高效)
如果数据量较大,用Pandas会更高效,代码也更简洁:
import pandas as pd # 构造DataFrame(实际可直接用pd.read_csv读取CSV文件) df = pd.DataFrame( csv_rows, columns=['out_gate', 'in_gate', 'num_connection'] ) # 确保连接数为整数类型 df['num_connection'] = df['num_connection'].astype(int) # 按out_gate和in_gate分组求和,转成宽表格式 summary_df = df.groupby(['out_gate', 'in_gate'])['num_connection'].sum().unstack(fill_value=0) # 按listfile的顺序调整行和列的排序 summary_df = summary_df.reindex(index=listfile, columns=listfile) # 将对角线位置(自身到自身)设为0 for gate in listfile: summary_df.loc[gate, gate] = 0 # 打印最终统计表 print(summary_df)
运行后输出结果和方法一完全一致,且处理大规模数据时性能更优。
内容的提问来源于stack exchange,提问作者kts




