Pandas Значения сводной таблицы - PullRequest
0 голосов
/ 15 января 2020

У меня есть фрейм данных в формате:

 Name     Score    Bin
 John     90       80-100
 Marc     30       20-40
 John     10       0-20
 David    20       0-20

...

Я хочу создать сводную таблицу, которая выглядит следующим образом:

Name    0-20    20-40    40-60    60-80    80-100   Total count   Avg score
John     1       2        nan      nan      2            5         60.53
Marc    nan      2        nan      nan     nan           2         32.13
David   3        2        nan      nan     nan           5         21.80

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

Я пробовал

table = pd.pivot_table(df, values=['Score', "Bin"], index=["nAME"],
                   aggfunc={"Score" : np.average, "Bin" : "count"},
                    dropna=True, margins = True)

, однако я просто получаю общее количество и не разбито на ведро

1 Ответ

0 голосов
/ 15 января 2020

Выполните свою задачу в 3 шага:

  1. Сгенерируйте сводную таблицу:

    df2 = pd.pivot_table(df, index='Name', columns='Bin', values='Score', aggfunc='count')\
        .reindex(columns=['0-20', '20-40', '40-60', '60-80', '80-100'])\
        .rename_axis(columns='')
    

    Результат, для которого ваши исходные данные расширены, чтобы дать примерно ожидаемый результат, is:

           0-20  20-40  40-60  60-80  80-100
    Name                                    
    David   3.0    2.0    NaN    NaN     NaN
    John    1.0    2.0    NaN    NaN     2.0
    Marc    NaN    2.0    NaN    NaN     NaN
    

    Примечание. Поскольку NaN является частным случаем float , другие значения также имеют тип float .

  2. Генерировать Total_count и Avg_score :

    df3 = df.groupby('Name')\
        .agg(Total_count=('Score', 'count'), Avg_score=('Score', 'mean'))\
        .rename(columns={'Total_count': 'Total count', 'Avg_score': 'Avg score'})
    

    Результат:

           Total count  Avg score
    Name                         
    David            5       21.8
    John             5       61.0
    Marc             2       32.0
    
  3. Объединить обе таблицы:

    result = df2.join(df3)
    

    Результат:

           0-20  20-40  40-60  60-80  80-100  Total count  Avg score
    Name                                                            
    David   3.0    2.0    NaN    NaN     NaN            5       21.8
    John    1.0    2.0    NaN    NaN     2.0            5       61.0
    Marc    NaN    2.0    NaN    NaN     NaN            2       32.0
    
...