不修改外层for循环前提下用value_counts填充矩阵的高效方法咨询
解决方案
你可以直接利用NumPy的向量化索引特性替换掉Python层面的循环,仅需一行代码即可完成填充,性能远高于逐行迭代,且完全不需要修改外层逻辑、也不会用到groupby:
# 直接替换原有的两行for循环代码即可 res_matrix[i, table_count.index] += table_count.values.astype(int)
原理说明
- 你通过
value_counts()得到的table_count是Series结构,它的索引就是b列的取值val,对应值就是出现次数cnt - 代码直接通过
res_matrix[i, table_count.index]定位到结果矩阵第i行所有需要更新的位置,一次性批量累加对应计数 - 整个操作底层由C实现,完全规避了Python循环的解释器开销,数据量越大时性能优势越显著
兼容性说明
就算当前i对应的b列存在缺失的取值(部分j没有出现)也不会影响结果:未出现的j不会出现在table_count的索引里,自然不会被赋值,相当于加0,和原有逻辑的输出结果完全一致。
内容的提问来源于stack exchange,提问作者Fabrizio
相关产品推荐
相关产品推荐

