gpt4 book ai didi

python - pandas 聚合与自定义函数不一致吗?

转载 作者:行者123 更新时间:2023-12-03 08:18:31 28 4
gpt4 key购买 nike

我想我发现了 pandas.Series.agg 方法的异常。

这是我发现的。

>>> v = pd.Series([172, 172, 170.0, 170., 168.])
>>>
>>> v.agg(np.mean)
170.4
>>>
>>> v.agg(lambda x: np.mean(x))
0 172.0
1 172.0
2 170.0
3 170.0
4 168.0
dtype: float64
>>>
>>> np.mean(v)
170.4

我发现这令人沮丧,因为 lambda x: f(x) 应该与 f(x) 一样工作,对吧? .agg(func) 的输入是 Series (根据文档),但输出显示它不是。这是另一个输出。

>>> v.agg(lambda x: print(type(x)))
<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>
0 None
1 None
0 None
1 None
0 None
dtype: object

>>> v.agg(lambda x: print(x.tolist()))
[172.0, 172.0, 170.0, 170.0, 168.0]

什么?输出表明对于上述两种情况,lambda x: 的输入是不同的。我不确定是否可能。

这是我通过进一步调查得到的结果。

>>> v.agg(lambda x: np.mean(x))
0 172.0
1 172.0
0 170.0
1 170.0
0 168.0
dtype: float64
>>> v.groupby(level=0).agg(lambda x: np.mean(x))
0 170.0
1 171.0
dtype: float64
>>> v.agg(lambda x: np.mean(x.tolist()))
170.4

至少,lambda x: np.mean(x) 对于分组系列按预期工作!但谜团仍然存在。谁能帮我澄清这里发生了什么?

我使用 pandas.DataFrame.agg 和 lambda x: np.mean(x) 进行测试,它按预期工作!

>>> pd.DataFrame(v)
0
0 172.0
1 172.0
0 170.0
1 170.0
0 168.0
>>> pd.DataFrame(v).agg(lambda x: np.mean(x))
0 170.4
dtype: float64

====

综上所述,我的问题是下面两个结果就是smae。

v.groupby(by = [0]*len(v)).agg(np.mean)
v.groupby(by = [0]*len(v)).agg(lambda x: np.mean(x))

但是下面两个不一样。在pandas中这不被认为是不一致吗?

v.agg(np.mean)
v.agg(lambda x: np.mean(x))

它从哪里来?

最佳答案

>>> pd.DataFrame(v).agg(lambda x: np.mean(x))
0 170.4

上面的内容对您来说看起来不错,因为它正在应用于 axis=0 ,但是如果你通过 axis=1 ,您将得到与系列相同的结果:

>>> pd.DataFrame(v).agg(lambda x: np.mean(x), axis=1)
0 172.0
1 172.0
2 170.0
3 170.0
4 168.0
dtype: float64

问题是,DataFrame 有两个轴,即 0 和 1,但 Series 只有一个轴,即 0。当你在做v.agg(lambda x: np.mean(x))时,它分别应用于每个单独值的系列,类似于 pandas.Series.apply ,与您正在做 v.agg(np.mean) 时相比它适用于整个系列。

查看 docs for pandas.Series.agg :

Parameters: func: function, str, list or dict
Function to use foraggregating the data. If a function, must either work when passed aSeries or when passed to Series.apply.

关于python - pandas 聚合与自定义函数不一致吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68608076/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com