pandas groupby результат с использованием различных комбинаций логического массива в качестве ключей
Я попытался понять группу, используя логический массив в качестве ключа, вот тестовый код,
a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])
print(a)
A B C
0 True False False
1 False True False
Затем я попробовал другую комбинацию логического массива, которая кажется, что результат groupby все тот же r
b=a.groupby([False,False])
b.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
c=a.groupby([True,False])
c.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
d=a.groupby([False,True])
d.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
e=a.groupby([False,True])
e.apply(pd.DataFrame)
A B C
0 True False False
1 False True False
Ответы
Давайте разберемся
.groubpy().apply(pd.DataFrame)
поскольку вы используете во всех вариантах, берет строки из каждой группы и создает фрейм данных, который в основном возвращает self
, поэтому результат выглядит одинаково, но способ, которым панды попадают туда, в каждом случае разный
b=a.groupby([False,False])
: обе строки принадлежат одной группе (group_idFalse
) и анализируются вместе один раз для формирования одного и того же dfc=a.groupby([True,False])
: есть две группы по одной строке в каждой. Apply берет каждую группу и создает два отдельных DataFrame (по одному на группу). Затем объединяет и возвращает df, идентичный исходномуd=a.groupby([False,True])
: то же, что и №2, но теперь первая строка принадлежит группеFalse
. Если вы агрегировали или применили другую функцию (отличную от pandas.DataFrame), вы увидите df сTrue, False
индексом (сортировка по группам по умолчанию), а строка 1 появится как первая строка, потому что она принадлежит группеTrue
Это связано с тем, что переданный вами параметр группировки не может разрезать фрейм данных на необходимые части. Таким образом, он просто копирует весь фрейм данных и «прикрепляет» его к массиву группировки, который вы передаете. Пример -
a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])
c = a.groupby([True,False])
print('length of grouper object:',len(c))
print(' ')
print(list(c)[0])
print(' ')
print(list(c)[1])
length of grouper object: 2
(False, A B C
1 False True False)
(True, A B C
0 True False False)
Обратите внимание, что с массивом группировки [False, True] он просто сжимает весь фрейм данных a с каждым. Если вместо этого вы передали что-то, что он мог найти на оси 1, он рассмотрел бы элементы в этой серии для группировки набора данных.
Другой способ взглянуть на это состоит в том, что параметр группировки должен быть серией с именем, и это имя должно быть найдено в столбцах фрейма данных. Если вы передаете массив [True, False], он в основном интерпретируется как безымянный ряд и поэтому не может получить свои ключи для разделения.
Если вы хотите понять, как работает groupby, следуйте хорошим образам:

Разделение происходит по предоставленному ключу, и на этот ключ должна быть ссылка в индексе / столбцах, иначе его невозможно разделить и просто вернет неразделенный фрейм данных с каждой группой. Этот первый шаг - это то, что делает группер, затем - простые шаги применения и комбинирования. В кортежах, которые вы видите выше (вывод на печать), функция apply работает с t[1]
элементом каждого кортежа, после чего объединяет его с t[0]
элементом каждого кортежа и объединяется по вертикали.