Pandas DataFrame 自定义聚合函数奇怪的行为

Pandas DataFrame custom agg function strange behavior

我想使用自定义函数沿轴聚合 Pandas DataFrame,但我无法弄清楚该函数应该 return.

df = pd.DataFrame(np.arange(50).reshape(10,5))

您可以将 numpy 函数传递给 DataFrame.agg:

# Case 1
df.agg([np.mean], axis=1)

你得到了你所期望的:一个像 df 一样索引的 DataFrame,但只有一列:'mean'。 但出于某种原因,以下行为完全不同:

# Case 2
df.agg([lambda x:np.mean(x)], axis=1)

甚至

# Case 3
def f(x, **kwargs):
    return np.mean(x, **kwargs)

df.agg([f], axis=1)

为什么后两种情况的工作方式与第一种情况不同?

如果我没记错的话,Case 2 中发生的是 np.mean() 操作首先展平数组,因此正在计算每行条目的每列的平均值,这就是为什么当你 运行 df.agg([lambda x:np.mean(x)], axis=1) 其中 returns:

时你得到 DataFrame 中每个条目的平均值的原因
               0     1     2     3     4
0 <lambda>   0.0   1.0   2.0   3.0   4.0
1 <lambda>   5.0   6.0   7.0   8.0   9.0
2 <lambda>  10.0  11.0  12.0  13.0  14.0
3 <lambda>  15.0  16.0  17.0  18.0  19.0
4 <lambda>  20.0  21.0  22.0  23.0  24.0
5 <lambda>  25.0  26.0  27.0  28.0  29.0
6 <lambda>  30.0  31.0  32.0  33.0  34.0
7 <lambda>  35.0  36.0  37.0  38.0  39.0
8 <lambda>  40.0  41.0  42.0  43.0  44.0
9 <lambda>  45.0  46.0  47.0  48.0  49.0

关于 numpy 聚合函数与 the pandas documentation on the aggregation function 中的 pandas 聚合操作有何不同的具体点。

要使 Case 2 的行为与 Case 1 相同,您可以在 np.mean() 函数本身中指定轴:df.agg([lambda x:np.mean(x,axis=0)],axis=1),其中 returns以下:

   <lambda>
0       2.0
1       7.0
2      12.0
3      17.0
4      22.0
5      27.0
6      32.0
7      37.0
8      42.0
9      47.0

同样,您可以通过在 np.mean() 函数中指定 axis=0 使 Case 3 的行为与 Case 1 的行为相同:

def f(x, **kwargs):
    return np.mean(x, axis=0, **kwargs)

df.agg([f], axis=1)

还有这个returns:

      f
0   2.0
1   7.0
2  12.0
3  17.0
4  22.0
5  27.0
6  32.0
7  37.0
8  42.0
9  47.0