使用NaN和数组取pandas数据框的一行的平均值



下面是我可复制的例子:

import pandas as pd
import numpy as np
df = pd.DataFrame({'x' : [np.NaN, np.array([0,2])], 'y' : [np.array([3,2]),np.NaN], 'z' : [np.array([4,5]),np.NaN], 't' : [np.array([3,4]),np.array([4,5])]})

我想计算除NaN

外的每一行的均值数组我已经尝试了df.mean(axis=1),它为两行提供了NaN。这对我来说特别令人惊讶,因为df.sum(axis=1)似乎像我预期的那样工作。

[df.loc[i,:].mean() for i in df.index]确实有效,但我相信有一个更直接的解决方案。

另一个可能的解决方案:

df.apply(lambda x: np.mean(x[x.notnull()]), axis=1)

输出:

0    [3.3333333333333335, 3.6666666666666665]
1                                  [2.0, 3.5]
dtype: object

您的DataFrame使用objectdtype,这总是有点笨拙。它比本机类型慢,并且并不总是按照您期望的方式运行。

因为Pandas删除了"panel"类型,我建议您不要将此数据存储在DataFrame中。相反,将其存储在3D NumPy数组中,然后您可以使用np.nanmean()轻松计算平均值,同时忽略NaN。