如何用Python快速高效对按另一数组ID分组的数值求均值
方案1:纯NumPy向量化实现(性能最优,适配百万级以上数据)
完全无Python层面循环,时间复杂度为O(n),处理千万级规模数据也仅需毫秒级耗时:
import numpy as np # 先将原始列表转为numpy数组 values = np.array([0.1, 0.2, 5.7, 12.9, 3.5, 100.6]) locations = np.array([1, 5, 3, 1, 1, 3]) # 按位置ID分组统计求和、计数 sum_per_loc = np.bincount(locations, weights=values) count_per_loc = np.bincount(locations) # 提取实际出现的位置ID,计算对应均值 unique_locs = np.unique(locations) avg_per_loc = sum_per_loc[unique_locs] / count_per_loc[unique_locs]
运行后unique_locs和avg_per_loc为一一对应关系,你的示例输出为:
- 位置ID:
[1, 3, 5] - 对应均值:
[5.5, 53.15, 0.2]
如果你的位置ID存在负数、或者ID间隔极大(比如最大ID到百万级但唯一ID只有几百个),可以先做ID编码避免生成过大的中间数组:
unique_locs, inverse_idx = np.unique(locations, return_inverse=True) sum_per_loc = np.bincount(inverse_idx, weights=values) count_per_loc = np.bincount(inverse_idx) avg_per_loc = sum_per_loc / count_per_loc
方案2:Pandas实现(写法更简洁,兼容非整数ID)
如果你的位置ID不是整数、或者需要做更多后续分析,用Pandas分组统计代码更简洁,底层同样为C实现,性能远高于Python循环:
import pandas as pd df = pd.DataFrame({"value": values, "location": locations}) avg_result = df.groupby("location")["value"].mean().reset_index()
输出的avg_result就是包含位置ID和对应均值的DataFrame,可直接使用。
性能参考(100万长度数组测试)
- 纯NumPy方案:约2ms
- Pandas方案:约10ms
- Python循环遍历唯一ID计算:约120ms+
内容的提问来源于stack exchange,提问作者scotsman60
相关产品推荐
相关产品推荐

