如何将矩阵传入指数分布求和函数,解决Pandas KeyError报错
问题原因
- 取值逻辑错误:pandas的DataFrame默认用
A[参数]的形式取数时,参数会被识别为列名而非行索引。你的矩阵是5000行121列,列名最大为120(0索引规则)或者121(Excel列1开头规则),当循环中i变量取到121时,pandas会尝试查找名为121的列,不存在就触发KeyError。 - 数值格式问题:你表格里的数值用逗号作为小数点分隔符(比如
10,15实际是10.15),如果不提前转换,直接调用int()会触发类型转换报错。 - 行列数匹配问题:如果Excel第一列是行序号(表格中最左侧无表头的序列),读入时未设置为行索引的话,会被当成普通数据列,导致
A.shape返回的列数比实际数据多1,进一步触发索引越界。
解决方法
优先修正取值方式,用.iloc[行索引,列索引]按位置取数,同时处理数值格式和行索引问题,优化后的代码如下:
import numpy as np import pandas as pd # 读入Excel时指定逗号为小数点分隔符,第一列为行索引 A = pd.read_excel("matrix.xlsx", decimal=',', index_col=0) # 若读入后数值还是字符串格式,加这句批量转换:A = A.replace(',', '.', regex=True).astype(float) num_rows, num_cols = A.shape a = np.zeros((num_rows, num_cols)) for i in range(num_rows): for j in range(num_cols): # 用iloc按位置取数,不会触发列名查找的KeyError sample_count = int(A.iloc[i, j]) a[i, j] = np.sum(np.random.exponential(5000, sample_count))
如果要进一步提升运行速度,可以去掉两层Python循环,用向量化操作降低开销:
# 先把DataFrame转成numpy数组 A_np = A.astype(int).to_numpy() # 向量化生成结果 a = np.vectorize(lambda x: np.sum(np.random.exponential(5000, x)))(A_np)
内容的提问来源于stack exchange,提问作者gasg95
相关产品推荐
相关产品推荐

