电影评分数据集(UserID,MovieID,Rating,Timestamp)
聚合后单列-单指标统计:每个MovieID的平均评分
df.groupby("MovieID")["Rating"].mean()
聚合后单列-多指标统计:每个MoiveID的最高评分、最低评分、平均评分
#"Rating"为分组的列,mean,max,min为分组后的新列名
df.groupby("MovieID")["Rating"].agg(mean="mean", max="max", min=np.min)
#agg里的dict,key为分组的列,列表为函数的字符串,比如'mean',也可以是 np.min函数名的方式
df.groupby("MovieID").agg({"Rating":['mean', 'max', np.min]})
聚合后多列-多指标统计:每个MoiveID的评分人数,最高评分、最低评分、平均评分
#rating_mean新列名列名,元组里第一个参数是列名,第二个参数是应用的函数
df.groupby("MovieID").agg(rating_mean=("Rating", "mean"),user_count=("UserID",lambda x : x.nunique())
#字典中,key是列名,value是列表每个值是函数
df.groupby("MovieID").agg({"Rating": ['mean', 'min', 'max'],"UserID": lambda x :x.nunique()})
#x为聚合后的每个子df
df.groupby("MovieID").apply( lambda x: pd.Series( {"min": x["Rating"].min(), "mean": x["Rating"].mean()}))
记忆:agg(新列名=函数)、agg(新列名=(原列名,函数))、agg({"原列名":函数/列表})
agg函数的两种形式,等号代表“把结果赋值给新列”,字典/元组代表“对这个列运用这些函数”
一、数据准备
import pandas as pd
df = pd.read_csv(
r"D:\node\nd\Pandas_study\pandas_test\ratings.dat",
sep="::",
engine='python',
names="UserID::MovieID::Rating::Timestamp".split("::")
)
print(df.head(3))
二、 聚合后单列-单指标统计
#每个movieId的平均评分
result = df.groupby("MovieID")["Rating"].mean()
print(result.head())
三、 聚合后单列-多指标统计
每个MoiveID的评分人数,最高评分、最低评分、平均评分
方法一:agg函数传入字典,key是原列名,value是原列名和函数元组
result = df.groupby("MovieID")["Rating"].agg(
mean = "mean",max = "max",min = np.min
)
print(result.head())
方法二:agg函数传入字典,key是原列名,value是函数列表
result = df.groupby("MovieID").agg(
{"Rating":["mean","max",np.min]}
)
print(result.head())
二级索引变一级索引
result.columns = ["rating_mean", "rating_min","rating_max"]
print(result.head())
四、聚合后多列-多指标统计
每个MoiveID的评分人数,最高评分、最低评分、平均评分
方法1:agg函数传入字典,key是原列名,value是原列名和函数元组
result = df.groupby("MovieID").agg(
rating_mean=("Rating", "mean"),
rating_min=("Rating", "min"),
rating_max=("Rating", "max"),
user_count=("UserID", lambda x : x.nunique())
)
print(result.head())
方法2:agg函数传入字典,key是原列名,value是函数列表,统计后是二级索引,需要做索引处理
result = df.groupby("MovieID").agg(
{
"Rating": ['mean', 'min', 'max'],
"UserID": lambda x :x.nunique()
}
)
print(result.head())
列名的处理
#可以把一级索引当成列名
a = result["Rating"].head(3)
print(a)
#也可重新定义列名
result.columns = ["rating_mean", "rating_min","rating_max","user_count"]
print(result.head())
方法3:使用groupby之后apply对每个子df单独统计
def agg_func(x):
"""注意,这个x是子DF"""
# 这个Series会变成一行,字典KEY是列名
return pd.Series({
"rating_mean": x["Rating"].mean(),
"rating_min": x["Rating"].min(),
"rating_max": x["Rating"].max(),
"user_count": x["UserID"].nunique()
})
result = df.groupby("MovieID").apply(agg_func)
print(result.head())