Я не понимаю, почему apply
и transform
возвращают разные типы данных при вызове в одном кадре данных. То, как я объяснял две функции себе, прежде чем что-то пошло в строке "apply
, разрушает данные, а transform
выполняет то же самое, что и apply
, но сохраняет исходный индекс и не сворачивается". Рассмотрим следующее.
df = pd.DataFrame({'id': [1,1,1,2,2,2,2,3,3,4],
'cat': [1,1,0,0,1,0,0,0,0,1]})
Пусть идентифицируют те id
, которые имеют ненулевую запись в столбце cat
.
>>> df.groupby('id')['cat'].apply(lambda x: (x == 1).any())
id
1 True
2 True
3 False
4 True
Name: cat, dtype: bool
Великий. Однако, если бы мы хотели создать столбец индикаторов, мы могли бы сделать следующее.
>>> df.groupby('id')['cat'].transform(lambda x: (x == 1).any())
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 0
8 0
9 1
Name: cat, dtype: int64
Я не понимаю, почему dtype теперь int64
вместо логического значения, возвращаемого функцией any()
.
Когда я изменяю исходный фрейм данных, чтобы содержать некоторые логические значения (обратите внимание, что нули остаются), подход преобразования возвращает логические значения в столбце object
. Это лишняя тайна для меня, поскольку все значения являются логическими, но они перечислены как object
, по-видимому, для соответствия dtype
исходного столбца смешанного типа целых чисел и булевых элементов.
df = pd.DataFrame({'id': [1,1,1,2,2,2,2,3,3,4],
'cat': [True,True,0,0,True,0,0,0,0,True]})
>>> df.groupby('id')['cat'].transform(lambda x: (x == 1).any())
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 False
8 False
9 True
Name: cat, dtype: object
Однако, когда я использую все логические значения, функция преобразования возвращает логический столбец.
df = pd.DataFrame({'id': [1,1,1,2,2,2,2,3,3,4],
'cat': [True,True,False,False,True,False,False,False,False,True]})
>>> df.groupby('id')['cat'].transform(lambda x: (x == 1).any())
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 False
8 False
9 True
Name: cat, dtype: bool
Используя мои острые навыки распознавания образов, кажется, что dtype
полученного столбца зеркалирует исходный столбец. Я был бы признателен за любые подсказки о том, почему это происходит или что происходит под капотом в функции transform
. Приветствия.