我想找到 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/