Что передается для преобразования функции Series? - PullRequest
1 голос
/ 06 апреля 2019

Я использую transform функцию Series, но что-то меня запутало.

Я искал документацию Панд и гуглил, но не смог найти ответ.

Когда я использую np.sum, результат будет:

s = Series(range(7))
s.transform(lambda x:x + np.sum(x))

0     2
1     4
2     6
3     8
4    10
5    12
6    14
Name: A, dtype: int64

Итак, я думаю, x является элементом Series. Но когда я использую x.sum, результат будет:

s.transform(lambda x:x + x.sum())

0    29
1    30
2    31
3    32
4    33
5    34
6    35
Name: A, dtype: int64

x выглядит как серия. И когда s является фреймом данных, он получит тот же результат.
Я сбит с толку. Кто может помочь мне ответить на мой вопрос, большое спасибо.

1 Ответ

0 голосов
/ 07 апреля 2019

Я прочитал исходный код. Я обнаружил, что функция 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
...