Насколько я понимаю в groupby (), выбранный столбец действует как индекс для группировки остальных столбцов.

Так что если у меня есть

import pandas as pd  
df = pd.DataFrame([[0, 1, 3],[3, 1, 1],[3, 0, 0],[2, 3, 3],[2, 1, 0]], columns=list('xyz'))
gby = df.groupby('x')

df:
   x  y  z
0  0  1  3
1  3  1  1
2  3  0  0
3  2  3  3
4  2  1  0

И моя концептуальная модель группового результата

  y z
x 
0 1 3
2 3 3
  1 0
3 1 1
  0 0

Где столбцы - [y, z], а x - индекс.

Так что, если я выполню

ap = gby.apply(pd.DataFrame.sum)

Я ожидаю, что возвращение будет

    y  z
x 
0   1  3
2   4  3
3   1  1

Вместо этого он возвращается

x         
0  0  1  3
2  4  4  3
3  6  1  1

Где столбец x все еще включен в кадр данных, кто-нибудь может объяснить, что мне не хватает?

1
user3562812 31 Дек 2019 в 11:32

2 ответа

Совершенно логично.

df.groupby('x') имеет три группы: x = 0, x = 2 и x = 3 (различные значения для x).

Когда вы объединяетесь с sum(), вы получаете итоговые значения для y и z в каждой из этих 3 групп.

1
Freek Wiekmeijer 31 Дек 2019 в 11:52

где столбец x все еще включен в кадр данных, кто-нибудь может объяснить, что мне не хватает?

Я думаю, это ожидаемо, потому что GroupBy.apply работает со всеми столбцами, поэтому при использовании pd.DataFrame.sum он создает новый столбец x, а также преобразует x в индекс:

def f(x):
    print (x)
    print (x.sum())
    return x.sum()

   x  y  z
0  0  1  3
x    0
y    1
z    3
dtype: int64
   x  y  z
3  2  3  3
4  2  1  0
x    4
y    4
z    3
dtype: int64
   x  y  z
1  3  1  1
2  3  0  0
x    6
y    1
z    1
dtype: int64

ap = gby.apply(f)
print (ap)
   x  y  z
x         
0  0  1  3
2  4  4  3
3  6  1  1

Если по умолчанию используется функция sum, столбцы, используемые для группировки, не используются - устанавливайте только x для индексации:

ap = gby.sum()
print (ap)
   y  z
x      
0  1  3
2  4  3
3  1  1

Но если явно указать столбцы для суммы после groupby, это не исключается:

ap = gby['x','y','z'].sum()
print (ap)
   x  y  z
x         
0  0  1  3
2  4  4  3
3  6  1  1    
1
jezrael 31 Дек 2019 в 11:54
Спасибо за ответ. Я предполагаю, что меня беспокоит то, что столбец x в этом случае становится столбцом индекса, а apply () не будет работать с столбцом индекса. Я все еще не понимаю?
 – 
user3562812
31 Дек 2019 в 11:45
- Я добавил лучший образец apply - здесь groupby конвертирует x в индекс, но также суммирует значения x, потому что apply работает со всеми столбцами x,y,z
 – 
jezrael
31 Дек 2019 в 11:50
1
Большое спасибо. Я предполагаю, что до сих пор меня смущало то, что x больше не был столбцом в groupby, поэтому apply () не будет рассматривать x как столбец.
 – 
user3562812
31 Дек 2019 в 12:01