數據聚合
數據聚合是數據處理的最后一步,通常是要使每一個數組生成一個單一的數值。
數據分類處理:
- 分組:先把數據分為幾組
- 用函數處理:為不同組的數據應用不同的函數以轉換數據
- 合並:把不同組得到的結果合並起來
1.數據分類處理的核心: groupby()函數
導入模塊:
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
生成假數據
df = DataFrame({"sailer":np.random.randint(0,3,size=50),
"item":np.random.randint(0,3,size=50),
"price":np.random.randint(1,15,size = 50),
"weight":np.random.randint(50,150,size=50)})
df["sailer"] = df["sailer"].map({0:"李大媽",1:"王大爺",2:"宋大媽"})
df["item"] = df["item"].map({0:"白菜",1:"蘿卜",2:"青椒"})
def convert(x):
return x-x%10
df["weight"] = df["weight"].map(convert)
df
如:
對數據進行分組,聚合操作
根據item進行分組,然后求出各個菜品的平均價格
g = df.groupby(by=["item"])["price"]
g.median()
表現形式如上邊,數據格式為series
然后在根據sailer和item進行分類。
ret = df.groupby(by = ["sailer","item"])[["price"]].mean() #price值變成dataframe二維數如下圖:
ret.add_suffix("_mean") #給列添加后綴 add_prefix()添加前綴
根據條件進行分組,然后自定義方法展示數據:如下
ret2 = df.groupby(by = ["sailer","item"])
def count(x):
return (np.round(x.mean(),1),x.min(),x.max()) #numpy中有round()方法是將小數四舍五入到給定的小數位數
ret2.agg(count)
aggregate()或agg()是指在指定軸上使用一個或多個操作進行聚合。
分組后對幾個列添加不同的聚合映射關系
如下:對price求平均值,對重量求和
ret2 = df.groupby(by = ["sailer","item"])
ret2.agg({"price":"mean","weight":"sum"})
分組后使用透視表對數據進行聚合操作
pd.pivot_table(df,values=["sailer","weight"],index = ["sailer","item"],aggfunc ={"price":"mean","weight":"max"})
如下:對price、weight分別進行求平均值和最大值操作。
高級數據聚合
調用transform和apply實現上變相同的功能
df.groupby(["sailer","item"])[["price"]].apply(np.min)
#因為min,mean,median等聚合函數在numpy定義了,所以,調用聚合函數得去numpy中調用
# transform原來的數據有多長,現在的數據就有多長
# 有利於對和原來的數據進行合並。
使用transform對數據進行分組聚合操作
df1 = df.groupby(["sailer","item"])[["price"]].transform(np.mean)
df1.tail()