функция преобразования панд в качестве аргумента - PullRequest
0 голосов
/ 27 сентября 2018

Извините за длинную тему, Вопрос на самом деле намного короче, чем кажется.

Может кто-нибудь объяснить, как используется аргумент pandas.core.groupby.groupby.DataFrameGroupBy.transorm с типом функции?

Я написалэтот фрагмент, чтобы выяснить, какие аргументы передаются в функцию:

def printer(x): print(''); print(type(x)); print(x); return x
df = pd.DataFrame({'A': [1,1,2], 'B':[3,4,5], 'C':[6,7,8]})
print('initial dataframe:', df, '\n===TRANSFORM LOG BEGIN===', sep='\n')
df2 = df.groupby('A').transform(printer)
print('\n===TRANSFORM LOG END===', 'final dataframe:', df2, sep='\n')

Вывод (разбит на куски)

  1. initial dataframe:
       A  B  C
    0  1  3  6
    1  1  4  7
    2  2  5  8
    

ОК, продолжайте

===TRANSFORM LOG BEGIN===

<class 'pandas.core.series.Series'>
0    3
1    4
Name: B, dtype: int64

Видимо, мы получили группу значений для столбца B с ключом (столбец A значение) 1.Продолжить

3.

<class 'pandas.core.series.Series'>
0    3
1    4
Name: B, dtype: int64

??.Один и тот же объект Series передается дважды.Единственное оправдание, которое я могу себе представить, состоит в том, что есть две строки со столбцом A, равным 1, поэтому для каждого вхождения такой строки мы пересчитываем нашу transforming функцию.Кажется странным и неэффективным, вряд ли это так.

4.

<class 'pandas.core.series.Series'>
0    6
1    7
Name: C, dtype: int64

Это аналогично п.2 для другого столбца

5.

<class 'pandas.core.frame.DataFrame'>
   B  C
0  3  6
1  4  7

Почему нет аналога п.3 ??

6.

<class 'pandas.core.frame.DataFrame'>
   B  C
2  5  8
===TRANSFORM LOG END===

Это аналог п.6, но почему нет п.2 дляеще один группирующий ключ?

7.

final dataframe:
   B  C
0  3  6
1  4  7
2  5  8

TLDR

Помимо странного поведения, главное, что переданная функция получает оба Series и DataFrame объекты в качестве аргументов.Значит ли это, что он (функция) должен уважать оба типа?Существуют ли какие-либо ограничения на тип преобразования, поскольку функция по существу вызывается несколько раз для одних и тех же значений (Series, затем Dataframe, состоящих из этих Series), что-то вроде операции сокращения?

1 Ответ

0 голосов
/ 27 сентября 2018

pandas экспериментирует со входом (Series by Series или весь DataFrame), чтобы увидеть, может ли функция применяться более эффективно.Примечания из строки документации :

Текущая реализация предъявляет три требования к f:

  • f должно возвращать значение, которое либо имеет одинаковую формув качестве входного подкадра или может транслироваться в форму входного подкадра.Например, f возвращает скаляр, который будет транслироваться, чтобы иметь ту же форму, что и входной подкадр.
  • , если это DataFrame, f должен поддерживать приложение столбец за столбцом в подкадре.Если f также поддерживает применение ко всему подкадру, тогда используется быстрый путь, начиная со второго блока.
  • f не должен изменять группы.Мутация не поддерживается и может привести к неожиданным результатам.

Второй вызов той же функции также связан с поиском более быстрого пути.Вы видите то же самое поведение с apply :

В текущей реализации дважды примените вызовы func к первому столбцу / строке, чтобы решить, может ли он использовать быстрый или медленный путь кода.Это может привести к неожиданному поведению, если у func есть побочные эффекты, так как они будут действовать дважды для первого столбца / строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...