Educoder python Pandas進階 第1關:Pandas分組聚合


任務描述

本關任務:使用Pandas加載drinks.csv文件中的數據,根據數據信息求每個大洲紅酒消耗量的最大值與最小值的差以及啤酒消耗量的和。

相關知識

分組聚合的流程主要有三步:

  • 分割步驟將DataFrame按照指定的鍵分割成若干組;

  • 應用步驟對每個組應用函數,通常是累計、轉換或過濾函數;

  • 組合步驟將每一組的結果合併成一個輸出數組。

分組

通常我們將數據分成多個集合的操作稱之爲分組,Pandas中使用groupby()函數來實現分組操作。

單列和多列分組

對分組後的子集進行數值運算時,不是數值的列會自動過濾


 
  1. import pandas as pd
  2. data = {'A': [1, 2, 2, 3, 2, 4],
  3. 'B': [2014, 2015, 2014, 2014, 2015, 2017],
  4. 'C': ["a", "b", "c", "d", "e", "f"],
  5. 'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
  6. }
  7. df = pd.DataFrame(data)
  8. df.groupby("B") #單列分組 返回的是一個groupby對象
  9. df.groupby(["B","C"]) #多列分組

Series系列分組

選取數據幀中的一列作爲index進行分組:


 
  1. df["A"].groupby(df["B"]) #df的 A 列根據 B 進行分組

通過數據類型或者字典分組

數據類型分組:


 
  1. df.groupby(df.dtypes,axis=1) # axis=1表示按列分組,以數據類型爲列名

傳入字典分組:


 
  1. dic = {"A": "number", "B": "number", "C": "str", "D": "number"}
  2. df.groupby(dic, axis=1) #按列分組,列名是字典的值

獲取單個分組

使用get_group()方法可以選擇一個組。


 
  1. df.groupby("A").get_group(2)

輸出:


 
  1. A B C D
  2. 1 2 2015 b 0.9
  3. 2 2 2014 c 2.1
  4. 4 2 2015 e 0.5

對分組進行迭代

GroupBy對象支持迭代,可以產生一組二元元組(由分組名和數據塊組成)。


 
  1. for name,data in df.groupby("A"):
  2. print(name)
  3. print(data)

輸出:


 
  1. 1
  2. A B C D
  3. 0 1 2014 a 0.5
  4. 2
  5. A B C D
  6. 1 2 2015 b 0.9
  7. 2 2 2014 c 2.1
  8. 4 2 2015 e 0.5
  9. 3
  10. A B C D
  11. 3 3 2014 d 1.5
  12. 4
  13. A B C D
  14. 5 4 2017 f 0.1

聚合

聚合函數爲每個組返回單個聚合值。當創建了groupby對象,就可以對分組數據執行多個聚合操作。比較常用的是通過聚合函數或等效的agg方法聚合。常用的聚合函數如下表:

函數名 說明
count 分組中非空值的數量
sum 非空值的和
mean 非空值的平均值
median 非空值的中位數
std、var 無偏標準差和方差
min、max 非空值的最小和最大值
prod 非空值的積
first、last 第一個和最後一個非空值

應用單個聚合函數

對分組後的子集進行數值運算時,不是數值的列會自動過濾


 
  1. import pandas as pd
  2. import numpy as np
  3. data = {'A': [1, 2, 2, 3, 2, 4],
  4. 'B': [2014, 2015, 2014, 2014, 2015, 2017],
  5. 'C': ["a", "b", "c", "d", "e", "f"],
  6. 'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
  7. }
  8. df = pd.DataFrame(data)
  9. df.groupby("B").sum() #對分組進行求和

應用多個聚合函數


 
  1. df.groupby("B").agg([np.sum,np.mean,np.std])

自定義函數傳入agg()中


 
  1. def result(df):
  2. return df.max() - df.min()
  3. df.groupby("B").agg(result) #求每一組最大值與最小值的差

對不同的列使用不同的聚合函數


 
  1. mapping = {"A":np.sum,"B":np.mean}
  2. df.groupby("C").agg(mapping)

編程要求

使用Pandas中的read_csv()函數讀取step1/drinks.csv中的數據,數據的列名如下表所示,請根據continent分組並求每個大洲紅酒消耗量的最大值與最小值的差以及啤酒消耗量的和。在右側編輯器begin-end處補充代碼。

列名 說明
country 國家名
beer_servings 啤酒消耗量
spirit_servings 白酒消耗量
wine_servings 紅酒消耗量
total_litres_of_pure_alcohol 純酒精總量
continent 大洲名

測試說明

平臺會對你編寫的代碼進行測試:

測試輸入:

預期輸出:


 
  1. wine_servings beer_servings
  2. continent
  3. Africa 233 3258
  4. Asia 123 1630
  5. Europe 370 8720
  6. North America 99 3345
  7. Oceania 212 1435
  8. South America 220 2101
import pandas as pd
import numpy as np
'''
返回最大值與最小值的和
'''
def sub(df):
    ######## Begin #######
    return df.max() - df.min()
    ######## End #######
def main():
    ######## Begin #######
    data = pd.read_csv("step1/drinks.csv")
    df = pd.DataFrame(data)
    mapping = {"wine_servings":sub,"beer_servings":np.sum}
    print(df.groupby("continent").agg(mapping))
    ######## End #######
if __name__ == '__main__':
    main()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章