Я прочитал исходный код. Я обнаружил, что функция transform
зависит от функции aggregate
. И сначала она попытается применить правило:
def aggregate(self, func, axis=0, *args, **kwargs):
# Validate the axis parameter
self._get_axis_number(axis)
result, how = self._aggregate(func, *args, **kwargs)
if result is None:
# we can be called from an inner function which
# passes this meta-data
kwargs.pop('_axis', None)
kwargs.pop('_level', None)
# try a regular apply, this evaluates lambdas
# row-by-row; however if the lambda is expected a Series
# expression, e.g.: lambda x: x-x.quantile(0.25)
# this will fail, so we can try a vectorized evaluation
# we cannot FIRST try the vectorized evaluation, because
# then .agg and .apply would have different semantics if the
# operation is actually defined on the Series, e.g. str
try:
result = self.apply(func, *args, **kwargs)
except (ValueError, AttributeError, TypeError):
result = func(self, *args, **kwargs)
return result
Итак, сначала он передаст скаляр в пользовательскую функцию. Функция transform
вызовет s.apply(lambda x: x + x.sum())
, вызовет AttributeError
, а затем передаст всю серию пользовательской функции. Например:
def func(x):
print(type(x))
print(x)
return x + x.sum()
s.transform(func)
<class 'int'>
1
<class 'pandas.core.series.Series'>
0 1
1 2
2 3
3 4
4 5
5 6
6 7
Name: A, dtype: int64
0 29
1 30
2 31
3 32
4 33
5 34
6 35
Name: A, dtype: int64