我正在尝试掌握transform
和apply
熊猫方法之间的区别。 This的答案很有帮助。第一个主要区别仅适用于从DataFrameGroupBy对象调用transform
的情况,因此它丝毫不影响来自Series的调用。第二个主要区别是transform
执行检查以确保方法的输出长度与其输入长度匹配。因此,我尝试提出一个测试案例,其中我从Seires调用这些方法,并且apply
成功执行,而transform
由于长度差异而失败。我最终得到的是这样:
some_series.apply(lambda x:pd.Series([1,2]))
some_series.transform(lambda x:pd.Series([1,2]))
令我惊讶的是,他们两个都以完全相同的方式成功地创建了一个包含两列的DataFrame。如果transform
使用len()
函数检查长度,那是有道理的,因为len()
返回行数,并且不会改变。但是接下来我很难解决行数可能发生变化的任何情况,因为transform/apply
进行的函数调用的次数似乎由原始行数决定系列,无论函数调用返回什么确切信息。
问题是,从Series对象调用时,transform
和apply
方法的行为是否完全不同?如果没有,似乎只应使用apply
,因为它更快。
答案 0 :(得分:0)
我以posting this question on pandas GitHub结尾。事实证明,这两种方法的行为毕竟可以不同。具体来说,Series.apply()
始终将单个单元格作为函数参数传递,而Series.transform()
在某些情况下可将整个Series作为函数参数传递。我仍然不确定如何应用此属性,因为通过转换可以对整个Series进行的任何操作都可以直接在该Series上进行。我唯一的猜测是较短的更简洁的代码,但是不能肯定地说。