Как игнорировать максимальное и минимальное количество строк при применении функции description к группе панд - PullRequest
0 голосов
/ 17 января 2019

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

data = {'class': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b'],
       'num': [-10,18,12,15,50, 10,60,51,54,100]}
df = pd.DataFrame(data)
df.groupby('class').describe()

Выход:

         num
        count   mean    std        min    25%    50%     75%    max
class                               
a      5.0     17.0   21.494185   -10.0   12.0    15.0  18.0    50.0
b      5.0     55.0   31.984371    10.0   51.0    54.0  60.0    100.0

Результат, который я хочу получить:

       num       
       count    mean    std         min     25%     50%     75%  max
class                               
a      3.0      15.0    3.000000    12.0    13.5    15.0    16.5    18.0
b      3.0      55.0    4.582576    51.0    52.5    54.0    57.0    60.0

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Другой метод с использованием apply(), idxmax() и idxmin()

>>df.groupby('class').apply(lambda x: x.drop([x['num'].idxmax(),x['num'].idxmin()])).rename_axis([None,None]).groupby('class').describe()

     num
     count mean std         min    25%     50%      75%     max
class                               
a   3.0   15.0  3.000000    12.0    13.5    15.0    16.5    18.0
b   3.0   55.0  4.582576    51.0    52.5    54.0    57.0    60.0

Объяснение: Выполните групповую операцию на class и удалите индекс значений max и min из каждой группы. затем выполните групповой вызов на class и вызовите функцию describe().

0 голосов
/ 17 января 2019

Использование transform и маскировка:

df['max']=df.groupby('class')['num'].transform('max')
df['min']=df.groupby('class')['num'].transform('min')

mask = df['num'].ne(df['min'])&df['num'].ne(df['max'])

df.loc[mask,:].groupby('class')['num'].describe()

       count  mean       std   min   25%   50%   75%   max
class                                                     
a        3.0  15.0  3.000000  12.0  13.5  15.0  16.5  18.0
b        3.0  55.0  4.582576  51.0  52.5  54.0  57.0  60.0

Или:

df.loc[mask, ['class', 'num']].groupby('class').describe()
        num                                              
      count  mean       std   min   25%   50%   75%   max
class                                                    
a       3.0  15.0  3.000000  12.0  13.5  15.0  16.5  18.0
b       3.0  55.0  4.582576  51.0  52.5  54.0  57.0  60.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...