如何用Pandas高效计算数据集所有点组合的求和(大数据量场景)
解决方案
针对大规模数据集,我们可以通过向量化操作+组合生成的方式高效计算所有点两两组合的ct求和值,核心思路是先为每行生成所有有效点对,再对相同点对的ct值进行聚合求和。
步骤说明
- 提取所有存储点的列(排除
ct列); - 对每行的点生成无序两两组合(通过排序点对避免重复统计
(p1,p2)和(p2,p1)); - 将每行的ct值关联到对应的所有点对;
- 按点对分组,对ct值求和得到最终结果。
代码实现
import pandas as pd from itertools import combinations # 示例数据(替换为你的实际数据集) data = { 'Col1': ['Id1', 'Id8'], 'col2': ['id2', 'id3'], 'col3': ['id3', 'id5'], 'col4': ['id4', 'id2'], 'col5': ['id5', 'id4'], 'col6': ['id6', 'id6'], 'ct': [30, 45] } df = pd.DataFrame(data) # 获取所有点列的名称 point_columns = df.columns.drop('ct') # 定义函数:生成每行的点对并关联ct def generate_pairs(row): points = row[point_columns].tolist() # 生成两两组合并排序,确保无序对唯一 sorted_pairs = [tuple(sorted(pair)) for pair in combinations(points, 2)] return pd.DataFrame(sorted_pairs, columns=['p1', 'p2']).assign(ct=row['ct']) # 生成所有点对数据并合并 all_pairs = df.apply(generate_pairs, axis=1).concat() # 按点对分组求和 final_result = all_pairs.groupby(['p1', 'p2'], as_index=False)['ct'].sum() print(final_result)
效率说明
itertools.combinations是C语言实现的高效组合生成工具,能快速生成每行的C(n,2)个点对(n为每行的点数,此处n=6);- Pandas的
concat和groupby均为向量化操作,避免了Python循环的开销,适合处理大规模数据集; - 通过排序点对确保无序对的唯一性,避免了重复聚合的冗余计算。
执行上述代码后,输出结果与预期一致:
p1 p2 ct 0 Id2 id4 75 1 Id2 id6 75 2 Id3 id4 75 3 Id3 id5 75 4 Id3 id6 75 5 Id4 id6 75 6 Id5 id6 75
内容的提问来源于stack exchange,提问作者Илья Бобров
相关产品推荐
相关产品推荐

