本關任務:使用
Pandas
加載drinks.csv
文件中的數據,根據數據信息求每個大洲紅酒消耗量的最大值與最小值的差以及啤酒消耗量的和。分組聚合的流程主要有三步:
分割步驟將
DataFrame
按照指定的鍵分割成若干組;應用步驟對每個組應用函數,通常是累計、轉換或過濾函數;
組合步驟將每一組的結果合併成一個輸出數組。
通常我們將數據分成多個集合的操作稱之爲分組,
Pandas
中使用groupby()
函數來實現分組操作。對分組後的子集進行數值運算時,不是數值的列會自動過濾
import pandas as pd
data = {'A': [1, 2, 2, 3, 2, 4],
'B': [2014, 2015, 2014, 2014, 2015, 2017],
'C': ["a", "b", "c", "d", "e", "f"],
'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
}
df = pd.DataFrame(data)
df.groupby("B") #單列分組 返回的是一個groupby對象
df.groupby(["B","C"]) #多列分組
選取數據幀中的一列作爲
index
進行分組:
df["A"].groupby(df["B"]) #df的 A 列根據 B 進行分組
數據類型分組:
df.groupby(df.dtypes,axis=1) # axis=1表示按列分組,以數據類型爲列名
傳入字典分組:
dic = {"A": "number", "B": "number", "C": "str", "D": "number"}
df.groupby(dic, axis=1) #按列分組,列名是字典的值
使用
get_group()
方法可以選擇一個組。
df.groupby("A").get_group(2)
輸出:
A B C D
1 2 2015 b 0.9
2 2 2014 c 2.1
4 2 2015 e 0.5
GroupBy
對象支持迭代,可以產生一組二元元組(由分組名和數據塊組成)。
for name,data in df.groupby("A"):
print(name)
print(data)
輸出:
1
A B C D
0 1 2014 a 0.5
2
A B C D
1 2 2015 b 0.9
2 2 2014 c 2.1
4 2 2015 e 0.5
3
A B C D
3 3 2014 d 1.5
4
A B C D
5 4 2017 f 0.1
聚合函數爲每個組返回單個聚合值。當創建了
groupby
對象,就可以對分組數據執行多個聚合操作。比較常用的是通過聚合函數或等效的agg
方法聚合。常用的聚合函數如下表:
函數名 說明 count 分組中非空值的數量 sum 非空值的和 mean 非空值的平均值 median 非空值的中位數 std、var 無偏標準差和方差 min、max 非空值的最小和最大值 prod 非空值的積 first、last 第一個和最後一個非空值 對分組後的子集進行數值運算時,不是數值的列會自動過濾
import pandas as pd
import numpy as np
data = {'A': [1, 2, 2, 3, 2, 4],
'B': [2014, 2015, 2014, 2014, 2015, 2017],
'C': ["a", "b", "c", "d", "e", "f"],
'D': [0.5, 0.9, 2.1, 1.5, 0.5, 0.1]
}
df = pd.DataFrame(data)
df.groupby("B").sum() #對分組進行求和
df.groupby("B").agg([np.sum,np.mean,np.std])
def result(df):
return df.max() - df.min()
df.groupby("B").agg(result) #求每一組最大值與最小值的差
mapping = {"A":np.sum,"B":np.mean}
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 大洲名 平臺會對你編寫的代碼進行測試:
測試輸入:
預期輸出:
wine_servings beer_servings
continent
Africa 233 3258
Asia 123 1630
Europe 370 8720
North America 99 3345
Oceania 212 1435
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()