pandas -й способ выполнять простые вычисления для строк, выбранных из DataFrame - PullRequest
0 голосов
/ 17 июня 2020

Предположим, у меня есть следующие данные:

import pandas as pd

boxes = {'Color': ['Green','Green','Green','Blue','Blue','Red','Red','Red'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square','Square','Square','Rectangle'],
         'Price': [10,15,5,5,10,15,15,5]
        }

df = pd.DataFrame(boxes, columns= ['Color','Shape','Price'])

Как мне найти среднюю цену каждого цвета (без учета формы) без циклов for? Или разница между максимальной и минимальной ценой каждого цвета?

Короче говоря, мне нужен следующий результат:

        Mean    Range
Green   10.00   10
Blue    7.50    5
Red     11.67   10

В этом примере всего три цвета, но если бы у нас было 1000 цветов, будет ли метод по-прежнему тем же / наиболее эффективным?

Ответы [ 3 ]

4 голосов
/ 18 июня 2020

Вы можете использовать следующее:

df = df.groupby('Color').agg([np.mean, np.ptp])
df.columns = ['Mean', 'Range']

И вы получите ожидаемый результат.

Pandas groupby может использовать несколько функций агрегирования. Самый простой способ продолжить - использовать собственные функции фреймов данных, такие как .mean() или .max(). Можно также использовать .agg() и передать массив функций для применения, таких как numpy функции или даже лямбда-функция.

1 голос
/ 17 июня 2020
g = df.groupby('Color')['Price']
df = pd.concat([g.mean(), g.max() - g.min()], axis=1)
df.columns = ['Mean', 'Range']
print(df)

Печать:

            Mean  Range
Color                  
Blue    7.500000      5
Green  10.000000     10
Red    11.666667     10
1 голос
/ 17 июня 2020

Groupby в столбце color, получить агрегаты, а для диапазона получить разницу между max и min

result = (df.groupby("Color")
          .agg(["mean","max","min"])
          .droplevel(0,axis=1)
           #access the max column with brackets
           #rather than dot access
           #as it is a built-in function
          .assign(Range= lambda x: x['max'] - x['min'],
                  mean = lambda x: x['mean'].round(2)
                 )
          .iloc[:,[0,-1]]
         )

result

        mean  Range
Color       
Blue    7.50    5
Green   10.00   10
Red     11.67   10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...