Pandas groupby + Numpy median:包含多个元素的数组的真值是二义的



我试图获得一系列数组的总列中位数。例如:

a = np.array([[1,9,3],[1,1,1],[8,5,4]])
df = pd.DataFrame(columns=["a"])
df["a"] = list(a)
df["b"] = [1,1,2]
A = df.groupby("b")["a"].apply(lambda x: np.mean(x, axis=0))
print(A)
B = df.groupby("b")["a"].apply(lambda x: np.median(x, axis=0))
print(B)

得到平均值很好,但中位数给出的误差

ValueError:包含多个元素的数组的真值是不明确的。使用a.a any()或a.a all()

np.mean被numpy和pandas显式支持。Numpy mean将检查是否有一个mean属性附加到传入的结构(Numpy源代码)。如果有,则使用pandasNDFrame.mean函数(pandas源代码)。

然而,np.median没有这样的支持,因为numpy不检查是否有一个median属性可以使用。

因此,需要首先将值转换为有效的2d数组(通过np.median显式或隐式)。

B = df.groupby("b")["a"].apply(lambda x: np.median([*x], axis=0))

B:

b
1    [1.0, 5.0, 2.0]
2    [8.0, 5.0, 4.0]
Name: a, dtype: object

以下选项也可以:

  • np.median(x.tolist(), axis=0)
  • np.median(np.array([*x]), axis=0)
  • np.median(np.array(x.tolist()), axis=0)