【问题标题】:Pandas DataFrame custom agg function strange behaviorPandas DataFrame 自定义 agg 函数的奇怪行为
【发布时间】:2021-06-28 21:11:25
【问题描述】:

我想使用自定义函数沿轴聚合 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)

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

【问题讨论】:

    标签: pandas aggregation


    【解决方案1】:

    如果我没记错的话,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
    

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

    要使Case 2 的行为与Case 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2018-07-18
      • 2017-11-15
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多