Pandas 高效生成期望频数表的最优实现方法
Pandas 实现期望频数表的最高效方案
最高效的实现方式是使用Pandas/numpy的矢量化广播运算,完全避免逐单元格循环的开销,代码如下:
import pandas as pd # 构造示例DataFrame data = [[1, 2, 3, 4], [4, 3, 2, 1]] df = pd.DataFrame(data, columns = ['A', 'B', 'C', 'D']) # 计算核心逻辑 row_total = df.sum(axis=1) # 计算每行的合计 col_total = df.sum(axis=0) # 计算每列的合计 total = df.values.sum() # 计算所有元素的总合计 # 广播运算生成期望频数表 expected_df = pd.DataFrame( row_total.values[:, None] * col_total.values / total, columns=df.columns, index=df.index )
逻辑说明
row_total.values[:, None]将行合计的一维数组转换为列向量,和列合计的一维数组做广播乘法时,会自动扩展为和原DataFrame维度相同的矩阵- 全程为底层C实现的矢量化运算,比Python层面的循环、apply操作性能高出1~2个数量级,数据量越大优势越明显
- 运行结果和预期输出完全一致,所有单元格值均为2.5
内容的提问来源于stack exchange,提问作者drec4s
相关产品推荐
相关产品推荐

