Получение низкого, высокого и среднего значения из столбца - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь получить минимум, максимум и среднее из столбца. Однако я хотел бы агрегировать только по значению столбца. Например, если у нас есть 2 строки с одинаковым значением столбца, мы объединяем их вместе. Кроме того, они должны быть одного перевозчика. Примерно так:

До обработки:

carrier   class   price
SP        A       22
VZ        C       33
XM        A       50 
XM        D       20     
SP        A       88
VZ        C       100

После обработки:

carrier   class   price   low   high   mean
SP        A       22      22    88     55
VZ        C       33      33    100    66.5
XM        A       50      50    50     50
XM        D       20      20    20     20
SP        A       88      22    88     55
VZ        C       100     33    100    66.5

Как видите, если у нас один и тот же оператор связи и один и тот же класс, мы агрегируем и получаем низкие, высокие и средние значения. Если у нас один и тот же перевозчик, но нет одного и того же класса, то мы не агрегируем, но мы все равно получаем среднее значение low, high, то же самое, что и цена класса.

Я хочу, чтобы результат был точно таким, какой он есть после обработки. Результатом должен быть фрейм данных. Как мне это сделать?

1 Ответ

0 голосов
/ 29 октября 2018

Используйте DataFrameGroupBy.agg со списком кортежей для новых имен столбцов с функцией агрегирования и join для оригинала DataFrame:

d = [('low','min'),('high','max'),('mean','mean')]
df1 = df.join(df.groupby(['carrier','class'])['price'].agg(d), on=['carrier','class'])
print (df1)
  carrier class  price  low  high  mean
0      SP     A     22   22    88  55.0
1      VZ     C     33   33   100  66.5
2      XM     A     50   50    50  50.0
3      XM     D     20   20    20  20.0
4      SP     A     88   22    88  55.0
5      VZ     C    100   33   100  66.5

Detail:

print (df.groupby(['carrier','class'])['price'].agg(d))
               low  high  mean
carrier class                 
SP      A       22    88  55.0
VZ      C       33   100  66.5
XM      A       50    50  50.0
        D       20    20  20.0

Или используйте transform, веселое решение:

d = [('low','min'),('high','max'),('mean','mean')]
g = df.groupby(['carrier','class'])['price']
for i, j in d:
    df[i] = g.transform(j)
print (df)
  carrier class  price  low  high  mean
0      SP     A     22   22    88  55.0
1      VZ     C     33   33   100  66.5
2      XM     A     50   50    50  50.0
3      XM     D     20   20    20  20.0
4      SP     A     88   22    88  55.0
5      VZ     C    100   33   100  66.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...