我试图获得一系列数组的总列中位数。例如:
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)