程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Pandas DataFrame 自定义 agg 函数奇怪的行为大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Pandas DataFrame 自定义 agg 函数奇怪的行为?

开发过程中遇到Pandas DataFrame 自定义 agg 函数奇怪的行为的问题如何解决?下面主要结合日常开发的经验,给出你关于Pandas DataFrame 自定义 agg 函数奇怪的行为的解决方法建议,希望对你解决Pandas DataFrame 自定义 agg 函数奇怪的行为有所启发或帮助;

我想使用自定义函数沿轴聚合 Pandas DataFrame,但无法确定该函数应返回的内容。

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

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

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

你得到了你所期望的:一个 DataFrame 索引就像 df,但有一列:'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) 时,您将获得 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),它返回以下内容:

   <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() 函数中指定 Case 3 使 Case 1 的行为与 axis=0 一样:

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

大佬总结

以上是大佬教程为你收集整理的Pandas DataFrame 自定义 agg 函数奇怪的行为全部内容,希望文章能够帮你解决Pandas DataFrame 自定义 agg 函数奇怪的行为所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。