一. Pandas加载数据
1. 读取文件, 获取df对象. df = pd.read_csv('data/gapminder.tsv', sep='\t') df.head()
根据列名加载
场景1: 加载1列数据. # 格式: df['列名'] 或者 df.列名 df['country'] df.country 场景2: 加载多列数据. # 格式: df[['列名1', '列名2'...]] df[['country', 'year', 'lifeExp']]
根据行加载
# 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] # 最后一行
获取指定行列的数据
格式: 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条数据
二. 分组聚合
格式
完整写法: df对象.groupby([分组的列名1, 分组的列名2...]).aggregate({'要被聚合操作的字段1':'聚合函数名', '要被聚合操作的字段2':'聚合函数名'...}) 简写1: df对象.groupby([分组的列名1, 分组的列名2...]).agg({'要被聚合操作的字段1':'聚合函数名', '要被聚合操作的字段2':'聚合函数名'...}) 简写2: 多个分组的列名和多个聚合字段, 但是都进行相同的聚合操作 df对象.groupby([分组列名1, 分组列名2...])[['聚合字段1', '聚合字段2'...]].聚合函数() 简写3: 分组列名和聚合字段都只有 一个 df对象.groupby('分组列名').['聚合列名'].聚合函数()
聚合函数相同
分组字段1个,1个聚合字段
需求1: 每年的平均预期寿命. # 类推到MySQL中, SQL语句写法为: select year, avg(lifeExp) as 别名 from df group by year; df.groupby('year')['lifeExp'].mean() # 细节: 分组字段会作为 索引列
分组字段1个, 多个聚合字段
# 需求2: 每一年的平均人口和平均GDP. df.groupby('year')[['pop', 'gdpPercap']].mean()
多个分组字段, 多个聚合字段
需求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'})
三. Pandas基本绘图
需求: 绘制每年, 平均预期寿命的图. # 1. 计算每年的平均预期寿命. # data = df.groupby('year')['lifeExp'].mean() data = df.groupby('year').lifeExp.mean() # 语法糖, 效果同上 data data.plot.line()# 折线图 data.plot() # 效果同上 data.plot.bar() # 柱状图 data.plot.pie() # 饼图 data.plot.area()# 面积图
四. Pandas数分相关的常用统计值
# 1. 读取数据, 获取df对象 # movie = pd.read_csv('data/movie.csv', index_col='movie_title') movie = pd.read_csv('data/movie.csv') movie.head()
mv.shape # 维度: (行数, 列数) (4916, 28) mv.info() # 基本信息 mv.describe() # 查看统计信息, 列形式 mv.describe().T # 查看统计信息, 行形式 mv.describe(include='all') # 统计信息, 所有字段 mv.describe(include='object') # 统计信息, 字符串类型的列信息 mv.describe(include=object) # 效果同上 mv.describe(include=['int', 'object']) # 统计信息, 整型和字符串型信息
五. 常用的排序函数(案例)
导入数据
mv = pd.read_csv('data/movie.csv') mv.head()查看所有列
mv.columns
找出小成本高口碑电影
方式1: 分解版
# 1. 获取显示的列 mv1 = mv[['movie_title', 'imdb_score', 'budget']] # 找出口碑最高的100部电影 mv2 = mv1.sort_values('imdb_score', ascending=False).head(100) # mv2 # 在口碑最高的基础上, 找出预算最低的10部电影 mv2.sort_values('budget').head(10)
方式2: 合并版
mv[['movie_title', 'imdb_score', 'budget']].nlargest(100, 'imdb_score').nsmallest(10, 'budget')
每年评分最高的电影
方式1: 分解版
# 获取指定列 mv1 = mv[['title_year', 'movie_title', 'imdb_score']] # 按年, 评分, 降序排序 mv2 = mv1.sort_values(['title_year', 'imdb_score'], ascending=False) # 去重 mv2.drop_duplicates(subset='title_year')
方式2: 合并版
mv[['title_year', 'movie_title', 'imdb_score']].sort_values(['title_year', 'imdb_score'], ascending=[False, False]).drop_duplicates(subset='title_year') mv[['title_year', 'movie_title', 'imdb_score']].sort_values(['title_year', 'imdb_score'], ascending=False).drop_duplicates(subset='title_year')
每年每种电影分级中预算最少电影
mv[['title_year', 'content_rating', 'movie_title', 'budget']].sort_values(['title_year','content_rating', 'budget'], ascending=[False,False, True]).drop_duplicates(subset=['title_year', 'content_rating'])