Извините за длинную тему, Вопрос на самом деле намного короче, чем кажется.
Может кто-нибудь объяснить, как используется аргумент 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')
Вывод (разбит на куски)
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
), что-то вроде операции сокращения?