Анализ данных Pandas - подробное объяснение очень простого в использовании Groupby

анализ данных
Анализ данных Pandas - подробное объяснение очень простого в использовании Groupby

Публичный аккаунт WeChat: «Python Reading Finance»
Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение в публичном аккаунте

При ежедневном анализе данных часто необходимоРазделите на разные группы в соответствии с (несколькими) полямиНапример, в области электронной коммерции общий объем продаж страны делится по провинциям, и анализируются изменения продаж в каждой провинции. В Pandas в основном используются вышеперечисленные операции обработки данныхgroupbyГотово, эта статья познакомитgroupbyОсновной принцип и соответствующиеagg,transformиapplyработать.

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

company=["A","B","C"]

data=pd.DataFrame({
    "company":[company[x] for x in np.random.randint(0,len(company),10)],
    "salary":np.random.randint(5,50,10),
    "age":np.random.randint(15,50,10)
}
)
company salary age
0 C 43 35
1 C 17 25
2 C 8 30
3 A 20 22
4 B 10 17
5 B 21 40
6 A 23 33
7 C 49 19
8 B 8 30

Во-первых, основной принцип Groupby

В пандах код для реализации операции группировки очень прост, требуется только одна строка кода, Здесь приведенный выше набор данныхcompanyПоля разделены:

In [5]: group = data.groupby("company")

Введите вышеуказанный кодipython, вы получитеDataFrameGroupByобъект

In [6]: group
Out[6]: <pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002B7E2650240>

что это породилоDataFrameGroupByЧто это? правильноdataПроведенныйgroupbyЧто произошло после этого?ipythonВозвращаемый результат — это его адрес в памяти, что не способствует интуитивному пониманию.groupЧто именно находится внутри, здесь положитьgroupпреобразовать вlistВзгляните на форму:

In [8]: list(group)
Out[8]:
[('A',   company  salary  age
  3       A      20   22
  6       A      23   33), 
 ('B',   company  salary  age
  4       B      10   17
  5       B      21   40
  8       B       8   30), 
 ('C',   company  salary  age
  0       C      43   35
  1       C      17   25
  2       C       8   30
  7       C      49   19)]

После преобразования в вид списка видно, что список состоит из трех кортежей, и в каждом кортеже первым элементом является группа (здесь согласноcompanyГруппировка, поэтому окончательно разделена наA,B,C), второй элемент находится в соответствующей группеDataFrame, весь процесс можно проиллюстрировать следующим образом:

groupby原理.png

заключить,groupbyпроцесс заключается в преобразовании исходногоDataFrameв соответствии сgroupbyполе (вотcompany), разделенный на несколько分组DataFrame, разбитых на столько групп, сколько их分组DataFrame. ** Итак, вgroupbyПосле ряда операций (например,agg,applyд.), исходя из子DataFrameоперация. **Понимая это, вы можете в принципе понять, что есть в Pandas.groupbyОсновной принцип работы. Давайте поговорим оgroupbyОбычные операции после этого.

2. операция агрегирования

Совокупные операцииgroupbyПосле очень распространенной операции можно было бы написатьSQLДрузья должны быть хорошо знакомы с этим. Операции агрегирования можно использовать для суммирования, среднего, максимума, минимума и т. д. В следующей таблице перечислены общие операции агрегирования в Pandas.

функция использовать
min минимум
max максимальное значение
sum сумма
mean значит
median медиана
std среднеквадратичное отклонение
var дисперсия
count считать

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

In [12]: data.groupby("company").agg('mean')
Out[12]:
         salary    age
company
A         21.50  27.50
B         13.00  29.00
C         29.25  27.25

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

In [17]: data.groupby('company').agg({'salary':'median','age':'mean'})
Out[17]:
         salary    age
company
A          21.5  27.50
B          10.0  29.00
C          30.0  27.25

aggПроцесс агрегации можно проиллюстрировать следующим образом (второй пример является примером):

agg图解.png

Три, трансформация

transformКакие манипуляции с данными? иaggкакие отличия есть? для лучшего пониманияtransformиaggСледующие сравнения сделаны из реальных сценариев применения.

вышеaggВ мы научились находить среднюю зарплату сотрудников в разных компаниях.Если нам теперь нужно добавить новый столбец в исходный набор данныхavg_salary,представлятьСредняя заработная плата компании, в которой работает сотрудник (работники одной компании имеют одинаковую среднюю заработную плату), как этого добиться? Если вы выполняете обычные шаги для расчета, вам нужно сначала получить среднюю заработную плату в разных компаниях, а затем заполнить соответствующую должность в соответствии с соответствующими отношениями между сотрудником и компанией.transformЕсли это так, код реализации выглядит следующим образом:

In [21]: avg_salary_dict = data.groupby('company')['salary'].mean().to_dict()

In [22]: data['avg_salary'] = data['company'].map(avg_salary_dict)

In [23]: data
Out[23]:
  company  salary  age  avg_salary
0       C      43   35       29.25
1       C      17   25       29.25
2       C       8   30       29.25
3       A      20   22       21.50
4       B      10   17       13.00
5       B      21   40       13.00
6       A      23   33       21.50
7       C      49   19       29.25
8       B       8   30       13.00

При использованииtransformЕсли это так, требуется только одна строка кода:

In [24]: data['avg_salary'] = data.groupby('company')['salary'].transform('mean')

In [25]: data
Out[25]:
  company  salary  age  avg_salary
0       C      43   35       29.25
1       C      17   25       29.25
2       C       8   30       29.25
3       A      20   22       21.50
4       B      10   17       13.00
5       B      21   40       13.00
6       A      23   33       21.50
7       C      49   19       29.25
8       B       8   30       13.00

Или посмотрите на это графическиgroupbyЗаднийtransformПроцесс реализации (для более наглядного отображения на рисунке добавленыcompanyстолбец, на самом деле только в соответствии с приведенным выше кодомsalaryСписок):

transform图解.png

Большая коробка на картинкеtransformиaggразные, даagg, будет рассчитанA,B,CСреднее значение, соответствующее компании и возвращенное напрямую, но дляtransform, будетПолучите соответствующий результат для каждого фрагмента данных, и выборки в одной группе будут иметь одинаковое значение., после вычисления среднего внутри группы будетв порядке исходного индексаВерните результат, если вы не поняли, вы можете сделать эту фотографию иaggСравните это.

4. применить

applyЭто должен быть старый друг каждого, его сравнивают сaggиtransformОн более гибкий и может передавать любую пользовательскую функцию для реализации сложных операций с данными. существуетОбработка данных Pandas по трем осям — карта, применение, применениеПодробная карта), введенныйapplyиспользовать, что вgroupbyпосле использованияapplyВ чем отличие от того, что было представлено ранее?

Отличия есть, но весь принцип реализации в основном одинаков. Разница между ними в том, что дляgroupbyПослеapply, с группировкой子DataFrameОсновной единицей операции является передача указанной функции в качестве параметра.DataFrame, а введенный ранееapplyОсновной единицей работы являетсяSeries. Или представить делоgroupbyПослеapplyиспользование.

Предположим, мне сейчас нужно получить данные самого старшего сотрудника каждой компании, как этого добиться? Этого можно добиться с помощью следующего кода:

In [38]: def get_oldest_staff(x):
    ...:     df = x.sort_values(by = 'age',ascending=True)
    ...:     return df.iloc[-1,:]
    ...:

In [39]: oldest_staff = data.groupby('company',as_index=False).apply(get_oldest_staff)

In [40]: oldest_staff
Out[40]:
  company  salary  age  
0       A      23   33       
1       B      21   40       
2       C      43   35      

Таким образом получаются данные самого старшего сотрудника каждой компании.Весь процесс проиллюстрирован следующим образом:

apply过程.png

Как видите, здесьapplyВ основном он такой же, как и принцип действия, представленный в предыдущей статье, за исключением того, что параметры, передаваемые в функцию,Seriesстал здесь分组DataFrame.

Наконец, оapplyиспользовать, вот небольшое предложение, хотя говоряapplyобладает большей гибкостью, ноapplyбудет более эффективным, чемaggиtransformПомедленнее. так,groupbyможно использовать позжеaggиtransformПроблема, которую необходимо решить, состоит в том, чтобы сначала использовать эти два метода и рассматривать возможность их использования только в том случае, если она не может быть решена.applyработать.

Отсканируйте код, чтобы подписаться на официальный аккаунт"Питон Чтение Финансов", получите галантерейные товары в первый раз, и вы также можете присоединиться к группе обмена обучением Python! !

底部二维码.png