transform没有足够的文档,但是似乎它的工作方式是传递转换函数不是将整个组作为数据框,而是单个组中的单个列。我不认为这确实意味着要执行的 *** 作,并且您的解决方案
apply也不错。
这样吧
tips.groupby('smoker').transform(func)。将有两个组,分别称为group1和group2。转换不会调用
func(group1)和
func(group2)。相反,它先调用
func(group1['total_bill']),然后依次
func(group1['tip'])是等,然后依次
func(group2['total_bill'])是
func(group2['tip'])。这是一个例子:
>>> print d A B C0 -2 5 41 1 -1 22 0 2 13 -3 1 24 5 0 2>>> def foo(df):... print ">>>"... print df... print "<<<"... return df>>> print d.groupby('C').transform(foo)>>>2 0Name: A<<<>>>2 2Name: B<<<>>>1 13 -34 5Name: A<<<>>>1 -13 14 0Name: B# etc.
您可以看到
foo首先被调用的是原始数据帧的C = 1组的A列,然后是该组的B列,然后是C = 2组的A列,等等。
如果您考虑转换的目的,这是有道理的。这是为了在组上应用转换功能。但是通常,将这些功能应用于整个组时,仅应用于给定的列,就没有意义。例如,pandas文档中的示例是有关使用进行z标准化的
transform。如果您有一个带有年龄和体重列的Dataframe,那么就这两个变量的总体平均值进行z标准化是没有意义的。拿一堆数字的整体平均值甚至都没有任何意义,其中一些是年龄,一些是权重。您必须相对于平均年龄对年龄进行标准化,相对于平均体重,对体重进行标准化,这意味着您要为每列分别进行转换。
因此,基本上,您无需在此处使用转换。
apply是适当的功能,因为
apply实际上每个组都作为一个Dataframe进行
transform*** 作,而对每个组的每一列进行 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)