<p>我想找出熊猫的平均数。所以我使用了熊猫默认提供的以下平均值函数。<a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.mean.html" rel="nofollow noreferrer">Link to its doc</a></p>
<pre><code>df.mean()
</code></pre>
<p>但该函数的问题是,如果所有值的总和大于数据类型的限制,则会发生溢出。在我的例子中,我有<code>float16</code>的数据,记录数超过2000万条。很明显,所有记录的总数都会溢出<code>float16</code>。一种方法是将数据类型更改为<code>float64</code>,但这将使用太多的额外内存,因为每个值都在<code>~1900-2100</code>范围内。所以我想用<a href="https://stackoverflow.com/questions/1930454/what-is-a-good-solution-for-calculating-an-average-where-the-sum-of-all-values-e">here</a>给出的方法迭代实现mean。下面是我对pandas数据帧的实现</p>
<pre><code>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
</code></pre>
<p>对于每一列,我迭代所有行。所以总的迭代次数将是<code># of columns * # of records</code>。但是,这不会溢出,并给出整个数据帧的正确平均值,但比pandas提供的默认平均值函数慢得多。你知道吗</p>
<p>所以我在这里错过了什么?我如何优化它?或者熊猫有没有现成的函数可以用来迭代求平均值?你知道吗</p>
<p><strong>编辑:</strong>
在计算平均值时,溢出似乎是一个常见的问题。我想知道为什么pandas中的默认<code>mean()</code>没有使用这样一种迭代方法来实现,这种方法可以防止在范围较小的数据类型中发生溢出。你知道吗</p>