Сравните два класса с диапазоном марок - PullRequest
0 голосов
/ 13 января 2020

У меня есть фрейм данных с двумя классами (A или B) и метками, и я хочу представить диапазоны меток для каждого класса.

Фрейм данных:

Class Mark  Department       
A     74.0  1 
A     73.0  2   
B     72.0  1
A     75.0  1
B     64.0  2

Чего я хочу достичь :

Class Mark Range        
A     73.0-75.0        
B     64.0-72.0 

и я думал об использовании min max (создание нового поля для диапазона). Но для начала я попытался сгруппировать его:

df['count'] = 1
result = df.pivot_table('count', index='Mark', columns='Class', aggfunc='sum').fillna(0)

, что сложно, и я быстро отказался от этого.

Тогда я сохранил только два столбца в моем фрейме данных (Mark и Class) и использовал следующее:

df[['Mark','Class']].values

И теперь мне просто нужно создать столбец диапазона Mark. Я думал, есть ли более простой способ без шагов, чтобы просто повернуть данные и проверить диапазон (минимум максимум столбца A, сгруппированного по столбцу B).

Ответы [ 3 ]

3 голосов
/ 13 января 2020

Мы можем использовать GroupBy.apply и получить max и min для каждой группы и представить их в виде строки с f-strings:

df = (
    df.groupby('Class')['Mark'].apply(lambda x: f'{x.min()}-{x.max()}')
      .reset_index(name='Mark Range')
)

  Class Mark Range
0  A     73.0-75.0
1  B     64.0-72.0
2 голосов
/ 13 января 2020

Просто, но безобразно:

temp = df.groupby('Class')['Mark'].agg({'min': min, 'max': max})
temp['range'] = temp['min'].map(str) + '-' + temp['max'].map(str)

Результат выполнения temp[['range']]:

           range
Class           
A      73.0-75.0
B      64.0-72.0
1 голос
/ 13 января 2020

Если вы заинтересованы в использовании pivot_table:

df_new = (df.pivot_table('Mark', 'Class', aggfunc=lambda x: f'{x.min()}-{x.max()}')
            .add_suffix(' Range').reset_index())

Out[1543]:
  Class Mark Range
0     A  73.0-75.0
1     B  64.0-72.0

Как в вашем комментарии. Чтобы добавить Deparment, просто используйте список ['Class', 'Department'] для index следующим образом

df_new = (df.pivot_table('Mark', ['Class', 'Department'], 
                          aggfunc=lambda x: f'{x.min()}-{x.max()}')
            .add_suffix(' Range').reset_index())

Out[259]:
  Class  Department Mark Range
0     A           1  74.0-75.0
1     A           2  73.0-73.0
2     B           1  72.0-72.0
3     B           2  64.0-64.0
...