Pandas实现groupby分组聚合后不同列数据统计

电影评分数据集(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))
image.png

二、 聚合后单列-单指标统计

#每个movieId的平均评分
result = df.groupby("MovieID")["Rating"].mean()
print(result.head())
image.png

三、 聚合后单列-多指标统计

每个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())
image.png
二级索引变一级索引
result.columns = ["rating_mean", "rating_min","rating_max"]
print(result.head())
image.png

四、聚合后多列-多指标统计

每个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())
image.png
方法2:agg函数传入字典,key是原列名,value是函数列表,统计后是二级索引,需要做索引处理
result = df.groupby("MovieID").agg(
    {
        "Rating": ['mean', 'min', 'max'],
        "UserID": lambda x :x.nunique()
    }
)
print(result.head())
image.png
列名的处理
#可以把一级索引当成列名
a = result["Rating"].head(3)
print(a)
#也可重新定义列名
result.columns = ["rating_mean", "rating_min","rating_max","user_count"]
print(result.head())
image.png
方法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())
image.png

你可能感兴趣的:(Pandas实现groupby分组聚合后不同列数据统计)