我搞不清熊猫函数和熊猫函数之间的区别
以下面的例子为例:加载一个数据集,执行一个groupby
,定义一个简单的函数,
以及用户.agg
或.apply
。
如您所见,函数中的printing语句会产生相同的输出
使用.agg
和.apply
后。另一方面,结果却不同。为什么?
import pandas
import pandas as pd
iris = pd.read_csv('iris.csv')
by_species = iris.groupby('Species')
def f(x):
...: print type(x)
...: print x.head(3)
...: return 1
使用apply
:
by_species.apply(f)
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 3.5 1.4 0.2 setosa
#1 4.9 3.0 1.4 0.2 setosa
#2 4.7 3.2 1.3 0.2 setosa
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 3.5 1.4 0.2 setosa
#1 4.9 3.0 1.4 0.2 setosa
#2 4.7 3.2 1.3 0.2 setosa
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#50 7.0 3.2 4.7 1.4 versicolor
#51 6.4 3.2 4.5 1.5 versicolor
#52 6.9 3.1 4.9 1.5 versicolor
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#100 6.3 3.3 6.0 2.5 virginica
#101 5.8 2.7 5.1 1.9 virginica
#102 7.1 3.0 5.9 2.1 virginica
#Out[33]:
#Species
#setosa 1
#versicolor 1
#virginica 1
#dtype: int64
使用agg
by_species.agg(f)
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#0 5.1 3.5 1.4 0.2 setosa
#1 4.9 3.0 1.4 0.2 setosa
#2 4.7 3.2 1.3 0.2 setosa
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#50 7.0 3.2 4.7 1.4 versicolor
#51 6.4 3.2 4.5 1.5 versicolor
#52 6.9 3.1 4.9 1.5 versicolor
#<class 'pandas.core.frame.DataFrame'>
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#100 6.3 3.3 6.0 2.5 virginica
#101 5.8 2.7 5.1 1.9 virginica
#102 7.1 3.0 5.9 2.1 virginica
#Out[34]:
# Sepal.Length Sepal.Width Petal.Length Petal.Width
#Species
#setosa 1 1 1 1
#versicolor 1 1 1 1
#virginica 1 1 1 1
当使用apply to a groupby时,我遇到了
.apply
将返回分组列。文档中有一个注释(pandas.pydata.org/pandas-docs/stable/groupby.html):.aggregate
将不返回分组列。apply
将函数应用于每个组(您的Species
)。您的函数返回1,因此您最终为3个组中的每个组返回1个值。agg
为每个组聚合每个列(feature),因此每个组的每个列都有一个值。一定要阅读^{} 文档,它们非常有用。还有很多教程在网上流传。
(注意:这些比较与DataframeGroupby对象相关)
与
.apply()
相比,使用.agg()
对于DataFrame GroupBy对象的一些可能的优点是:.agg()
提供了一次应用多个函数或将函数列表传递给每个列的灵活性。同时,将不同的函数同时应用于数据帧的不同列。
这意味着您可以在每次操作中对每一列都有很大的控制权。
以下是详细信息的链接:http://pandas.pydata.org/pandas-docs/version/0.13.1/groupby.html
然而,
apply
函数可以被限制为一次对数据帧的每列应用一个函数。因此,您可能需要反复调用apply函数来调用同一列的不同操作。下面是对DataframeGroupBy对象的
.apply()
与.agg()
的一些示例比较:给定以下数据帧:
让我们首先使用
.apply()
:查看操作现在,看一下使用.agg()毫不费力的相同操作:
因此,与
.apply()
相比,.agg()
在处理DataFrameGroupBy对象时非常方便。但是,如果只处理纯数据帧对象,而不处理数据帧GroupBy对象,则apply()
可能非常有用,因为apply()
可以沿数据帧的任何轴应用函数。(例如:
axis = 0
表示使用默认模式的.apply(),
按列操作,而在处理纯数据帧对象时,axis = 1
表示按行操作)。相关问题 更多 >
编程相关推荐