pandas groupby результат с использованием различных комбинаций логического массива в качестве ключей

Aug 19 2020

Я попытался понять группу, используя логический массив в качестве ключа, вот тестовый код,

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

Ответы

RichieV Aug 20 2020 at 04:23

Давайте разберемся

.groubpy().apply(pd.DataFrame)поскольку вы используете во всех вариантах, берет строки из каждой группы и создает фрейм данных, который в основном возвращает self, поэтому результат выглядит одинаково, но способ, которым панды попадают туда, в каждом случае разный

  1. b=a.groupby([False,False]): обе строки принадлежат одной группе (group_id False) и анализируются вместе один раз для формирования одного и того же df

  2. c=a.groupby([True,False]): есть две группы по одной строке в каждой. Apply берет каждую группу и создает два отдельных DataFrame (по одному на группу). Затем объединяет и возвращает df, идентичный исходному

  3. d=a.groupby([False,True]): то же, что и №2, но теперь первая строка принадлежит группе False. Если вы агрегировали или применили другую функцию (отличную от pandas.DataFrame), вы увидите df с True, Falseиндексом (сортировка по группам по умолчанию), а строка 1 появится как первая строка, потому что она принадлежит группеTrue

1 AkshaySehgal Aug 20 2020 at 04:14

Это связано с тем, что переданный вами параметр группировки не может разрезать фрейм данных на необходимые части. Таким образом, он просто копирует весь фрейм данных и «прикрепляет» его к массиву группировки, который вы передаете. Пример -

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]элементом каждого кортежа и объединяется по вертикали.