python - 自定义均值实现比 pandas 默认均值慢。如何优化?

标签 python python-3.x pandas optimization mean

我想找到 pandas Dataframe 的平均值。所以我使用了 Pandas 默认提供的以下均值函数。 Link to its doc

df.mean()

但是这个函数的问题是,如果所有值的总和大于数据类型的限制,就会发生溢出。就我而言,我的数据为 float16,记录数超过 2000 万条。所以显然所有记录的总和将溢出 float16。一种方法是将数据类型更改为 float64,但这将使用过多的额外内存,因为每个值都在 ~1900-2100 范围内。所以我想使用给定的方法迭代地实现均值 here .这是我对 Pandas 数据框的实现

def mean_without_overflow(df):
    avgs = []
    for column in df:
        avg, t = 0, 1
        for data in df[column]:
            if not math.isnan(data):
                avg += (data-avg) / t;
                t += 1
        avgs.append(avg)
    return avgs

在这里,对于每一列,我都在迭代所有行。因此,总迭代次数将是 # of columns * # of records。但是,这不会溢出并给出整个数据框的正确平均值,但它比 pandas 提供的默认均值函数慢得多。

那么我在这里缺少什么?我该如何优化呢?或者 pandas 中是否有任何开箱即用的函数可以迭代地寻找均值?

编辑: 溢出似乎是计算均值时的常见问题。我想知道为什么 pandas 中的默认 mean() 没有使用这种迭代方法来实现,这种方法可以防止较小范围的数据类型溢出。

最佳答案

我自己找到了解决方案。逻辑是首先通过将所有值除以系列长度(记录数)来归一化所有值,然后使用默认 df.mean() 然后将归一化平均值乘以记录数:这是从 1 分 37 秒提高到 3.13 秒。但是我仍然不明白为什么 pandas 实现没有使用这种优化。

def mean_without_overflow_fast(col):
    col /= len(col)
    return col.mean() * len(col)

按如下方式使用此功能:

print (df.apply(mean_without_overflow_fast))

关于python - 自定义均值实现比 pandas 默认均值慢。如何优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58557552/

相关文章:

python - PyParsing 和多行系统日志消息

python - 是否可以仅通过 dll 访问 .Net 运行时

python-3.x - 以字符串形式返回 Pandas DataFrame 索引

python - 这个字典理解与这个 "for"循环有什么不同?

python - 尝试使用时间戳作为位置选择 Pandas 中的数据切片

python - Python 中 Tesseract OCR 的 UnicodeDecodeError

python返回两个字典

python - Selenium 无法通过类名找到元素

python - 如何更新 DataFrame 中的特定值

python - 将 JSON 转换为 pd.DataFrame