首页 > 编程语言 >【python】Pandas 数据分析之分组聚合操作|代码讲解|建议在Jupyter Notebook 中运行

【python】Pandas 数据分析之分组聚合操作|代码讲解|建议在Jupyter Notebook 中运行

时间:2024-09-21 16:24:44浏览次数:3  
标签:Jupyter title python movie df Notebook imdb year groupby

建议在Jupyter Notebook 中运行
jupyter notebook环境搭建

文章目录

  • 1. Pandas加载数据
    • 1.1 根据 列名 加载数据
    • 1.2 根据 行 加载数据
    • 1.3 加载 指定行, 指定列 的数据
  • 2. 分组聚合
  • 3. Pandas基本绘图
  • 5. 常用的排序函数
    • 5.1 找到 小成本 高口碑的电影
    • 5.2 找到每年 imdb评分最高的电影.
    • 5.3 提取每年, 每种电影分级中 预算少的电影.

import numpy as np
import pandas as pd
import os

os.chdir(r'D:\hm\homework\pywork\workProject\numpyProject')  # 改变当前的工作目录.  change current work directory

1. Pandas加载数据

# 1. 读取文件, 获取df对象.

df = pd.read_csv('data/gapminder.tsv', sep='\t')
df.head()

1.1 根据 列名 加载数据

# 场景1: 加载1列数据. 

# 格式: df['列名'] 或者 df.列名

df['country']
df.country

# 场景2: 加载多列数据.

# 格式: df[['列名1', '列名2'...]]

df[['country', 'year', 'lifeExp']]

1.2 根据 行 加载数据

# head(), 默认是前5行

df.head()
df.head(n=2)  # 前2行

# tail(), 默认是后5行

df.tail()
df.tail(n=3)  # 后3行 
df.tail(n=1)  # 最后1行 

# loc: 根据 索引列 来获取数据的. 

df.loc[0]  # 第1行 => Series对象
df.loc[[0, 1, 2]]  # 第1, 2, 3行 => DataFrame对象

# df.loc[-1]              # 最后一行, 如果写-1, 则: 报错.

# iloc: 根据 行号 来获取数据的. 

df.iloc[0]  # 第1行 => Series对象
df.iloc[[0, 1, 2]]  # 第1, 2, 3行 => DataFrame对象

df.iloc[-1]  # 最后一行

1.3 加载 指定行, 指定列 的数据

# 格式: df对象.loc[[行], [列]]        # 索引列值 + 列名 的方式获取.

# 格式: df对象.iloc[[行], [列]]       # 行号 + 列的编号(索引) 的方式获取.

# 1. 精准的获取某几行的, 某几列.

df.loc[[0, 21, 211], :]  # : 可以代表: 所有行, 所有列.
df.loc[[0, 21, 211], ['country', 'year', 'lifeExp']]  # 获取指定列
df.iloc[[0, 21, 211], [0, 2, 3]]  # 获取指定列

# 2. 获取所有行的某几列.

# 写法1: 直接传入 列名 或者 列的索引

df.loc[:, ['continent', 'pop']]
df.iloc[:, [1, 4]]

# 写法2: 可以通过 range方式来生成 索引.

df.iloc[:, range(1, 5, 2)]  # 所有行, 索引为:1, 3列的信息.
df.loc[:, ['continent', 'lifeExp']]

# 写法3: 可以通过 切片的方式来生成索引.

df.iloc[:, 1:4]  # 所有行, 索引为:1, 2, 3列的信息, 包左不包右.
df.loc[:, ['continent', 'year', 'lifeExp']]

# 3. 下述代码, 执行结果是什么.

df.loc[range(0, 10, 2), ['lifeExp', 'pop']]
df.iloc[range(0, 10, 2), 3: 5]  # 第0, 2, 4, 6, 8行,  第3, 4列
df.iloc[range(10, -1, -2), 3: 5]
df.iloc[range(10, -2, -1), 3: 5]  # 10 ~ -1 => -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10  共12条数据

2. 分组聚合

# 格式: df对象.groupby([分组的列名1, 分组的列名2...])[[要被聚合操作的字段1, 字段2...]].聚合函数名()

# 上述格式的语法糖, 如果分组字段只有1个, 且聚合字段也只有1个, 则可以简写为: df对象.groupby('分组字段')['聚合字段'].聚合函数名()

# 场景1: 分组字段 和 聚合字段都只有1个.

# 需求1: 每年的平均预期寿命.

# 类推到MySQL中, SQL语句写法为: select year, avg(lifeExp) as 别名 from df group by year;

df.groupby('year')['lifeExp'].mean()  # 细节: 分组字段会作为 索引列

# 场景2: 分组字段 => 1个, 聚合字段 => 2个

# 需求2: 每一年的平均人口和平均GDP.

df.groupby('year')[['pop', 'gdpPercap']].mean()

# 场景3: 分组字段 => 2个, 聚合字段 => 3个

# 需求3: 统计每年, 每个大洲的 平均预期寿命, 平均人口, 平均GDP.

df.groupby(['year', 'continent'])[['lifeExp', 'pop', 'gdpPercap']].mean()

# 需求4: 统计每个大洲列出了多少个国家和地区.

# 理解1: 一共有多少个大洲, 多少个国家 共计参与了多少次.  即: 总次数.

# 类推SQL写法:  select continent, count(country) from df group by continent;

df.groupby('continent')['country'].value_counts()  # value_counts() 每个值出现了多少次

# 理解2: 每个大洲, 有多少个国家参与.   不同的大洲, 国家 => 总数.

# 类推SQL写法:  select continent, count(distinct country) from df group by continent;

df.groupby('continent')['country'].nunique()  # nunique() 去重统计, 根据洲分组, 根据国家去重统计.

# 扩展, 明天详细讲, 今天先看看, 能掌握最好.

# 需求5: 统计每年的 平均预期寿命, 最大的总人口, 最小的GDP

# 类推SQL写法: select year, avg(lifeExp), max(pop), min(gdpPercap) from df group by year;

# pandas写法: df对象.groupby([分组的列名1, 分组的列名2...]).aggregate({'要被聚合操作的字段1':'聚合函数名', '字段2':'聚合函数名'...})

# 语法糖, df对象.groupby([分组的列名1, 分组的列名2...]).agg({'要被聚合操作的字段1':'聚合函数名', '字段2':'聚合函数名'...})

df.groupby('year').agg({'lifeExp': 'mean', 'pop': 'max', 'gdpPercap': 'min'})
df.groupby('year').aggregate({'lifeExp': 'mean', 'pop': 'max', 'gdpPercap': 'min'})

3. Pandas基本绘图

# 需求: 绘制每年, 平均预期寿命的折线图.

# 1. 计算每年的平均预期寿命.

# data = df.groupby('year')['lifeExp'].mean()

data = df.groupby('year').lifeExp.mean()  # 语法糖, 效果同上
data

# 2. 绘制折线图.

data.plot()  # 语法糖, 默认是: 折线图    

# data.plot.line()  # 折线图    

# data.plot.bar()   # 柱状图

# data.plot.pie()   # 饼图

# 4. 和Pandas数分相关的常用统计值

# 1. 读取数据, 获取df对象

# movie = pd.read_csv('data/movie.csv', index_col='movie_title')

movie = pd.read_csv('data/movie.csv')
movie.head()

# 2. 查看和数据分析相关的统计值.

movie.shape  # 维度: (4916, 28) => (行数, 列数)

movie.info()  # 基本信息
movie.describe()  # 统计信息
movie.describe().T  # 统计信息, 行列转置

movie.describe(include='all')  # 统计信息, 所有字段
movie.describe(include='object')  # 统计信息, 字符串类型的列的信息
movie.describe(include=object)    # 语法糖写法, 效果同上

5. 常用的排序函数

# 1. 加载数据, 获取df对象.

movie = pd.read_csv('data/movie.csv')
movie.head()

5.1 找到 小成本 高口碑的电影

# 查看所有的列.

movie.columns

# 1. 从movie这个df对象中, 找到我们要用的列的信息. 

movie_df = movie[['movie_title', 'imdb_score', 'budget']]
movie_df.head()

# 2. 找到 高口碑(评分最高的前100部电影)

# movie_df.sort_values('imdb_score', ascending=False).head(100)

tmp_df = movie_df.nlargest(100, 'imdb_score')        # 效果同上.
tmp_df

# 3. 在高口碑的数据基础上, 找到 成品最低的那 10 部电影.

# tmp_df.sort_values('budget').head(10)        # ascending默认是True, 升序

tmp_df.nsmallest(10, 'budget')      # 效果同上.

# 4. 上述代码, 一行搞定.

movie[['movie_title', 'imdb_score', 'budget']].nlargest(100, 'imdb_score').nsmallest(10, 'budget')

5.2 找到每年 imdb评分最高的电影.

# 类推 SQL写法 select year, movie_title,  max(imdb_score) from df group by year, movie_title;  + 窗口函数

# 1. 获取到我们要处理的数据集.

movie_df = movie[['title_year', 'movie_title', 'imdb_score']]       # 电影名, 评分, 年费
movie_df.head()

# 2. 按照年排序, 降序.

movie_df.sort_values('title_year', ascending=False)

# 3. 按照年, 评分 降序排序.

tmp_df = movie_df.sort_values(['title_year', 'imdb_score'], ascending=False)
tmp_df

# 4. 基于上述的临时数据, 按照 年份去重, 保留第1份即可. 

# subset参数: 参考哪一列进行去重. 

tmp_df.drop_duplicates(subset='title_year')       

# 5. 一行代码搞定. 

# 完整代码

movie[['title_year', 'imdb_score', 'movie_title']].sort_values(['title_year', 'imdb_score'], ascending=[False, False]).drop_duplicates(subset='title_year')

# 语法糖

movie[['title_year', 'imdb_score', 'movie_title']].sort_values(['title_year', 'imdb_score'], ascending=False).drop_duplicates('title_year')

5.3 提取每年, 每种电影分级中 预算少的电影.

# 合并版.

# 1. 找到我们要用的字段

movie[['title_year', 'content_rating', 'movie_title', 'budget']]

# 2. 根据 年, 分级 降序排列,  根据预算 升序排列.

movie[['title_year', 'content_rating', 'movie_title', 'budget']].sort_values(['title_year', 'content_rating', 'budget'], ascending=[False, False, True])

# 3. 基于上述的数据, 按照 年, 分级 去重, 保留第1个数据即可.

movie[['title_year', 'content_rating', 'movie_title', 'budget']].sort_values(['title_year', 'content_rating', 'budget'], ascending=[False, False, True]).drop_duplicates(['title_year', 'content_rating'])

标签:Jupyter,title,python,movie,df,Notebook,imdb,year,groupby
From: https://blog.csdn.net/weixin_57336987/article/details/142398500

相关文章