Python: Количество уникальных значений в сводной таблице из фрейма данных

#python #pandas #dataframe

Вопрос:

Я хотел бы создать сводную таблицу, которая раскрывается amount (что я и сделал), и подсчитать uniqueID разбивку по месяцам .. последняя часть uniqueID -это то, с чем я борюсь.

У меня есть следующий фрейм данных с колонками: ['Agent', 'Player', 'Amount', 'Month', 'UniqueID']

Я смог сделать следующее:

Пытаюсь получить счетчик для UniqueID:

 df['UniqueID']= df['UniqueID'].map(df['UniqueID'].value_counts())
 

Я тоже пытался —

 df['UniqueID'] =len(set(df['UniqueID'])
 

Успешно создал свою сводную таблицу

 df = pd.pivot_table(df, index=['Agent','Player'], margins=True, margins_name='Total', columns=['Month'], values =['Amount','UniqueID'], aggfunc=np.sum)
 

Однако общая сумма, которую я получаю UniqueID , не является точной.
Я пытаюсь подсчитать количество UniqueID в месяц в своей сводке.
Любая помощь будет вам очень признательна.

Комментарии:

1. Пожалуйста, включите образец df

Ответ №1:

Давайте попробуем с aggfunc из nunique за UniqueID вместо sum :

 df = pd.pivot_table(df, index=['Agent', 'Player'], margins=True,
                    margins_name='Total', columns=['Month'],
                    values=['Amount', 'UniqueID'],
                    aggfunc={'Amount': 'sum', 'UniqueID': 'nunique'})
 

nunique будет получено количество уникальных значений для каждой группы.

              Amount                  UniqueID                
Month             1    2     3 Total        1    2    3 Total
Agent Player                                                 
A     C         3.0  NaN   NaN     3      1.0  NaN  NaN     1  # nunique is 1
      D         NaN  3.0   NaN     3      NaN  1.0  NaN     1
B     D         NaN  4.0   NaN     4      NaN  1.0  NaN     1
      E         NaN  NaN   5.0     5      NaN  NaN  1.0     1
      F         NaN  NaN   6.0     6      NaN  NaN  1.0     1
Total           3.0  7.0  11.0    21      1.0  2.0  2.0     5
 

Также можно использовать count , если хотите, количество всех UniqueID s

 df = pd.pivot_table(df, index=['Agent', 'Player'], margins=True,
                    margins_name='Total', columns=['Month'],
                    values=['Amount', 'UniqueID'],
                    aggfunc={'Amount': 'sum', 'UniqueID': 'count'})
 
              Amount                  UniqueID                
Month             1    2     3 Total        1    2    3 Total
Agent Player                                                 
A     C         3.0  NaN   NaN     3      2.0  NaN  NaN     2  # count is 2
      D         NaN  3.0   NaN     3      NaN  1.0  NaN     1
B     D         NaN  4.0   NaN     4      NaN  1.0  NaN     1
      E         NaN  NaN   5.0     5      NaN  NaN  1.0     1
      F         NaN  NaN   6.0     6      NaN  NaN  1.0     1
Total           3.0  7.0  11.0    21      2.0  2.0  2.0     6
 

Примеры Данных:

 df = pd.DataFrame({
    'Agent': ['A', 'A', 'A', 'B', 'B', 'B'],
    'Player': ['C', 'C', 'D', 'D', 'E', 'F'],
    'Amount': [1, 2, 3, 4, 5, 6],
    'Month': [1, 1, 2, 2, 3, 3],
    'UniqueID': [15, 15, 20, 21, 22, 23]
})
 

df :

   Agent Player  Amount  Month  UniqueID
0     A      C       1      1        15
1     A      C       2      1        15
2     A      D       3      2        20
3     B      D       4      2        21
4     B      E       5      3        22
5     B      F       6      3        23