Вернуть счетчик значений в панде df - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь вернуть значение count, основанное на двух столбцах в pandas df.

Для df ниже я пытаюсь определить счет на основе Column 'Event' & Column 'Who'.

import pandas as pd
import numpy as np

d = ({
    'Event' : ['A','B','E','','C','B','B','B','B','E','C','D'],
    'Space' : ['X1','X1','X2','','X3','X3','X3','X4','X3','X2','X2','X1'],
    'Who' : ['Home','Home','Even','Out','Home','Away','Home','Away','Home','Even','Away','Home']
    })

d = pd.DataFrame(data = d)

Я пробовал следующее.

df = d.groupby(['Event', 'Who'])['Space'].count().reset_index(name="count")

Который производит это:

  Event   Who  count
0         Out      1
1     A  Home      1
2     B  Away      2
3     B  Home      3
4     C  Away      1
5     C  Home      1
6     D  Home      1
7     E  Even      2

Но я бы хотел, чтобы это был текущий счет, а не общий.

Можно ли изменить df = d.groupby(['Event', 'Who'['Space'].count().reset_index(name="count"), чтобы отфильтровать дополнительные ограничения, или это должна быть функция mask или аналогичная?

Итак, мой предполагаемый результат:

   A_Away A_Home B_Away B_Home C_Away C_Home D_Away D_Home Event Space Who                       
0              1                                            A    X1    Home  
1                                                           B    X1    Home  
2                                                           E    X2    Even  
3                                                                      Out  
4                                          1                C    X3    Home  
5                     1                                     B    X3    Away  
6                            1                              B    X3    Home  
7                                                           B    X4    Away  
8                     2                                     B    X3    Home  
9                            2                              E    X2    Even  
10                                  1                       C    X2    Away  
11                                                1         D    X1    Home  

Таким образом, счет добавляется в строку. Не полный счет для всего набора данных.

1 Ответ

0 голосов
/ 25 июня 2018

Вот шаги, необходимые для достижения вашего результата:

  1. Подготовьте «Кто» и «Событие» в качестве индекса
  2. Получите совокупный счет для групп, используя groupbyи cumcount
  3. Измените / повернете / разверните ваш DataFrame в табличный формат, используя unstack
  4. Исправьте заголовки столбцов
  5. Объедините этот результат с оригиналом, используя pd.concat

# set the index
v = df.set_index(['Who', 'Event'], append=True)['Space']
# assign `v` the values for the cumulative count 
v[:] = df.groupby(['Event', 'Who']).cumcount().add(1)    
# reshape `v`
v = v.unstack([1, 2], fill_value='')
# fix your headers
v.columns = v.columns.map('{0[1]}_{0[0]}'.format)    
# concatenate the result
pd.concat([v.loc[:, ~v.columns.str.contains('Out')], df], 1)

   A_Home B_Home E_Even C_Home B_Away C_Away D_Home Event Space   Who
0       1                                               A    X1  Home
1              1                                        B    X1  Home
2                     1                                 E    X2  Even
3                                                                 Out
4                            1                          C    X3  Home
5                                   1                   B    X3  Away
6              2                                        B    X3  Home
7                                   2                   B    X4  Away
8              3                                        B    X3  Home
9                     2                                 E    X2  Even
10                                         1            C    X2  Away
11                                                1     D    X1  Home
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...