pandas python groupby_pandas之分组groupby()的使用整理与总结
前言
在使用pandas的時候,有些場景需要對數(shù)據內部進行分組處理,如一組全校學生成績的數(shù)據,我們想通過班級進行分組,或者再對班級分組后的性別進行分組來進行分析,這時通過pandas下的groupby()函數(shù)就可以解決。在使用pandas進行數(shù)據分析時,groupby()函數(shù)將會是一個數(shù)據分析輔助的利器。
groupby的作用可以參考 超好用的 pandas 之 groupby 中作者的插圖進行直觀的理解:
準備
讀入的數(shù)據是一段學生信息的數(shù)據,下面將以這個數(shù)據為例進行整理grouby()函數(shù)的使用:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv('./data.csv')
print(df)
Name Gender Age Score
0 Alen Male 18 80
1 Bob Male 19 90
2 Cidy Female 18 93
3 Daniel Male 20 87
4 Ellen Female 17 96
5 Frankie Male 21 100
6 Gate Male 20 88
7 Hebe Female 22 98
基本操作
在進行對groupby函數(shù)進行學習之前,首先需要明確的是,通過對DataFrame對象調用groupby()函數(shù)返回的結果是一個DataFrameGroupBy對象,而不是一個DataFrame或者Series對象,所以,它們中的一些方法或者函數(shù)是無法直接調用的,需要按照GroupBy對象中具有的函數(shù)和方法進行調用。
grouped = df.groupby('Gender')
print(type(grouped))
print(grouped)
分組時,不僅僅可以指定一個列名,也可以指定多個列名:
grouped = df.groupby('Gender')
grouped_muti = df.groupby(['Gender', 'Age'])
print(grouped.size())
print(grouped_muti.size())
Gender
Female 3
Male 5
dtype: int64
Gender Age
Female 17 1
18 1
22 1
Male 18 1
19 1
20 2
21 1
dtype: int64
指定多個列名個單個列名后的區(qū)別在于,分組的主鍵或者索引(indice)將一個是單個主鍵,另一個則是一個元組的形式:
print(grouped.get_group('Female'))
print(grouped_muti.get_group(('Female', 17)))
Name Gender Age Score
2 Cidy Female 18 93
4 Ellen Female 17 96
7 Hebe Female 22 98
Name Gender Age Score
4 Ellen Female 17 96
通過調用get_group()函數(shù)可以返回一個按照分組得到的DataFrame對象,所以接下來的使用就可以按照·DataFrame·對象來使用。如果想讓這個DataFrame對象的索引重新定義可以通過:
df = grouped.get_group('Female').reset_index()
print(df)
index Name Gender Age Score
0 2 Cidy Female 18 93
1 4 Ellen Female 17 96
2 7 Hebe Female 22 98
這里可以總結一下,由于通過groupby()函數(shù)分組得到的是一個DataFrameGroupBy對象,而通過對這個對象調用get_group(),返回的則是一個·DataFrame·對象,所以可以將DataFrameGroupBy對象理解為是多個DataFrame組成的。
而沒有調用get_group()函數(shù)之前,此時的數(shù)據結構任然是DataFrameGroupBy,此時進行對DataFrameGroupBy按照列名進行索引,同理就可以得到SeriesGroupBy對象,取多個列名,則得到的任然是DataFrameGroupBy對象,這里可以類比DataFrame和Series的關系。
按照上面的思路理解后,再調用get_group()函數(shù)后得到的DataFrame對象按照列名進行索引實際上就是得到了Series的對象,下面的操作就可以按照Series對象中的函數(shù)行了。
在沒有進行調用get_group(),也就是沒有取出特定某一組數(shù)據之前,此時的數(shù)據結構任然是DataFrameGroupBy,其中也有很多函數(shù)和方法可以調用,如max()、count()、std()等,返回的結果是一個DataFrame對象。
print(grouped.count())
print(grouped.max()[['Age', 'Score']])
print(grouped.mean()[['Age', 'Score']])
Name Age Score
Gender
Female 3 3 3
Male 5 5 5
Age Score
Gender
Female 22 98
Male 21 100
Age Score
Gender
Female 19.0 95.666667
Male 19.6 89.000000
如果其中的函數(shù)無法滿足你的需求,你也可以選擇使用聚合函數(shù)aggregate,傳遞numpy或者自定義的函數(shù),前提是返回一個聚合值。
def getSum(data):
total = 0
for d in data:
total+=d
return total
print(grouped.aggregate(np.median))
print(grouped.aggregate({'Age':np.median, 'Score':np.sum}))
print(grouped.aggregate({'Age':getSum}))
aggregate函數(shù)不同于apply,前者是對所有的數(shù)值進行一個聚合的操作,而后者則是對每個數(shù)值進行單獨的一個操作:
def addOne(data):
return data + 1
df['Age'] = df['Age'].apply(addOne)
df['Age'] = df['Age'].apply(int)
可視化操作
對組內的數(shù)據繪制概率密度分布:
grouped['Age'].plot(kind='kde', legend=True)
plt.show()
由于grouped['Age']是一個SeriesGroupby對象, 顧名思義, 就是每一個組都有一個Series. 所以直接plot相當于遍歷了每一個組內的Age數(shù)據。
REF
到此這篇關于pandas之分組groupby()的使用整理與總結的文章就介紹到這了,更多相關pandas groupby()分組內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
總結
以上是生活随笔為你收集整理的pandas python groupby_pandas之分组groupby()的使用整理与总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 惰性_Django中的“惰
- 下一篇: sql语句多个表补齐四位_SQL学习笔记