今天我們繼續推出一篇數據處理常用的操作技能匯總:靈活使用pandas.groupby()函數,實現數據的高效率處理,主要內容如下:
說到使用Python進行數據處理分析,那就不得不提其優秀的數據分析庫-Pandas,官網對其的介紹就是快速、功能強大、靈活而且容易使用的數據分析和操作的開源工具(pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool)。相信很多小夥伴都使用過,今天我們就詳細介紹下其常用的分組(groupby)功能。大多數的Pandas.GroupBy() 操作主要涉及以下的三個操作,該三個操作也是pandas. GroupBy()的核心,分別是:
第二步:在每個分離後的子對象上進行數據操作函數應用(Applying);第三步:將每一個子對象的數據操作結果合併(Combining)。而在Applying操作步驟中還可以進行以下數據操作處理:
聚合(Aggregation)處理:進行如平均值(mean)、最大值(max)、求和(sum)等一些統計性計算。轉換(Transformation)操作:執行一些特定於個別分組的數據處理操作,最常用的為針對不同分組情況選擇合適的值填充空值;篩選(Filtration)操作:這一數據處理過程主要是去除不符合條件的值,如根據均值和特定值篩選數據。接下來我們通過具體的例子對各個步驟進行講解。
pandas.groupby()實例演示首先,我們自己創建用於演示的數據,代碼如下:
import pandas as pd
import numpy as np
# 生成測試數據
test_data = {'Team': ['A', 'A', 'B', 'B', 'C','D', 'D', 'D', 'A', 'E', 'E', 'A'],
'Year': [2014,2015,2014,2015,2014,2015,2016,2017,2016,2014,2015,2017],
'values01':[876,789,863,673,741,812,756,788,694,701,804,690],
'values02': [120, 208, 250, 330, 430,240 ,710 ,190,252 , 364,197,288]}
test_dataest = pd.DataFrame(test_data)
test_dataest數據如下:
test_data
Splitting 分離操作首先我們根據單一變量進行分組,如按照Team列進行分組,代碼如下:
grouped = test_dataest.groupby('Team')
grouped
#<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000014A2F049A00>返回的是一個DataFrameGroupBy object,當然,我們也可以兩個或兩個以上的變量進行分組操作:
grouped2 = test_dataest.groupby(["Team","Year"])
grouped2返回同樣是分組對象,那麼我們如何查看分組後的各個小組的情況 以及分組後的屬性呢?代碼操作如下:
# 查看分組後的小組個數
len(grouped)
# 返回各個小組的情況
grouped.groups
#{'A': [0, 1, 8, 11], 'B': [2, 3], 'C': [4], 'D': [5, 6, 7], 'E': [9, 10]}
#注意:上面返回的數字為其對應的索引數(index)而當我們需要查看具體某一個小組的情況時,我們可是使用如下方法:
# 獲取A分組的情況
grouped.get_group("A")結果如下:
查看A分組情況
Applying數據計算操作一旦分組後,我們就可對分組後的對象進行Applying應用操作,這部分最常用的就是Aggregations摘要統計類的計算了,如計算平均值(mean),和(sum)等,下面我們通過實例解釋:還是以上方數據為主,這次我們根據Year列進行分組:
grouped = test_dataest.groupby("Year")在對分組後的grouped對象,我們使用aggregate()方法進行數據計算:
grouped = grouped.aggregate(np.sum)
grouped
aggregate操作或者直接使用:
grouped = test_dataest.groupby("Year").sum()結果都是一樣的。
如果我們對多列數據進行Applying操作,同樣還是計算和(sum),代碼如下:
grouped2 = test_dataest.groupby(["Team","Year"]).aggregate(np.sum)
grouped2
aggregate對多列操作除了sum()求和函數外,我們還列舉幾個pandas常用的計算函數,具體如下表:
函數(Function)描述(Description)mean()計算各組平均值size()計算分組大小count()計算組個數std()分組的標準偏差var()計算分組的方差describe()生成描述性統計min()計算分組值的最小值max()計算分組值的最大值可能有小夥伴問了,能不能對每一個分組結果計算多個結果值?即同時計算平均值(mean)、求和(sum)。答案是當然可以的。如我們同時計算均值和和,代碼如下:
grouped2 = test_dataest.groupby(["Team","Year"]).aggregate([np.mean,np.sum])
grouped2注意:aggregate()中使用列表將多個計算函數列出,即可計算多個結果了,結果如下:
同時計算多個結果
可能還有小夥伴問「能不能將聚合計算之後的新的結果列進行重命名呢?」,該操作在實際工作中經常應用的到,如:根據某列進行統計,並將結果重新命名。在pandas以前的版本中需要自定義聚合操作,如下:
# 定義aggregation匯總計算
aggregations = {
#在values01列上的操作
'values01': {
#獲取sum結果,並將該結果命名為 total_result
'total_result': 'sum',
#獲取mean結果,並將該結果命名為 average_result
'average_result': 'mean',
#獲取count統計結果,並將該結果命名為 num_result
'num_result': 'count'
},
# 在values02列上的操作
'values02': {
# Find the max, call the result "max_date"
'max_value': 'max',
'min_value': 'min',
#計算最大最小值差
'max-min': lambda x: max(x) - min(x)
}
}
#應用剛剛自己定義的aggregations
grouped4 = test_dataest.groupby(["Team"]).agg(aggregations)而在 Pandas 0.25.0.版本後新增「named aggregation」操作,即對agg的結果進行重新命名,不必再自己定義了。則以上代碼可更換如下:
grouped4 = test_dataest.groupby(["Team"]).agg(
total_result = ("values01","sum"),
average_result = ("values01","mean"),
num_result = ("values01","count"),
max_value = ("values02","max"),
min_value = ("values02","min"),
max_min = ("values02",lambda x: max(x) - min(x))
)
grouped4計算結果如下:
重命名agg結果接下來,我們再介紹Transformation(轉換),這裡我們舉一個例子即可:
grouped = test_dataest.groupby(["Year"])
score = lambda x: (x - x.mean()) / x.std()
trans_result = grouped.transform(score)
trans_result結果如下:
Transform操作這樣我們就可以使每個分組中的平均值為0,標準差為1了。該步驟日常數據處理中使用較少,大家若想了解更多,請查看Pandas官網。
最後一個 Applying 方法為篩選數據(Filtration),顧名思義,就是對所操作的數據集進行過濾操作。這裡舉一個例子大家就能明白了,即我們以Team列進行分組,並且希望我們的分組結果中每一組的個數都大於3,我們該如何分組呢?練習數據如下:
test_dataest實現上述要求的代碼操作如下:
groupby5 = test_dataest.groupby('Team').filter(lambda x: len(x) >= 3)結果就是將分組後小組個數大於3的數據篩選出來,如下:
Filtration Result以上就是對Pandas.groupby()操作簡單的講解一遍了,當然,還有更詳細的使用方法沒有介紹到,這裡只是說了我自己在使用分組操作時常用的分組使用方法。
總結這是第二篇關於數據處理小技巧的推文,本期介紹了Pandas.groupby()分組操作方法,重點介紹了幾個常用的數據處理方法,希望可以幫助到大家,接下來我會繼續總結日常數據處理過程中的小技巧,幫助大家總結那些不起眼但是經常遇到的數據處理小Tips。