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

4

我想使用自定义函数沿轴聚合 Pandas DataFrame,但我无法弄清楚该函数应返回什么。

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)

为什么后两种情况会与第一种情况有所不同呢?
1个回答

3
如果我没记错的话,Case 2 中发生的是np.mean()操作首先将数组展平,因此计算每行条目的每列均值,这就是当您运行df.agg([lambda x: np.mean(x)], axis=1)时返回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

pandas 聚合函数文档 中,有一个关于numpy聚合函数与pandas聚合操作的特定点。

要使“情况2”表现得像“情况1”一样,可以在np.mean()函数本身中指定轴:df.agg([lambda x: np.mean(x, axis=0)],axis=1),其返回以下结果:

   <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)

这将返回:

      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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接