总体思路为:
1.导包 2.加载数据 3.了解数据 4.清洗填充数据 5.处理分析数据 6.可视化展示
1.导包:
import pandas as pd
import numpy as np
2.加载数据:(自动生成df对象)
df = pd.read_csv("data/gapminder.tsv", sep='\t')
df = pd.read_csv(文件路径,文件编码,文件分隔符,...),除了csv还有很多其他方式...根据文件格式选择不同的读取方式
3.了解数据:
df.info()
df.describe()
df.isnull().sum()
df.describe(include='all')
不设置all的话,默认只统计数值类型数据
设置all的话,可以统计所有类型数据
4.清洗填充数据(缺失值详解):
产生的场景:原始数据本身就存在的;通过连接/运算等操作后期生成的
1.概念:空的没有任何意义。
pandas中表示形式:numpy.NaN,numpy.NAN,numpy.nan
2.了解查看缺失数据:
isnull():判断是否是空值
isna():判断是否是空值
notnull():判断是否不是空值
notna():判断是否不是空值
(注意: 本身也不等于本身:NaN == nan 结果False)
df.isnull().sum():计算df所有列的缺失值数量
3.处理缺失数据方法:
3.1删除缺失数据所在的行
new_train=train.dropna()
new_train2=train.dropna(how='all')
new_train3=train.dropna(subset=['Survived'])
new_train4=train.drop('Cabin',axis=1)
dropna():
how="any" : 一行中任意列有缺失值就删除
subset=[列,列] : 判断一行中指定列位置有缺失值就删除
how="all": 一行中所有列都是缺失值就删除
drop("列名",axis=1)
计算出某列缺失值数量非常多,可以考虑直接删除此列
3.2填充数据到缺失值位置
fillna(数据):
① 非线性填充和非时间序列填充:fillna(数字)
其中数字可以是0,可以是平均数,中位数,众数等
② 线性填充/时间序列填充:
df3=df.fillna(0)
df1=df.fillna(method='ffill')
df1=df.fillna(method='bfill')
Ⅰ:df.fillna(method = "ffill"):与前一个值一样,可以简化为df.ffill()
Ⅱ:df.fillna(method = "bfill"):与后一个值一样,可以简化为df.bfill()
Ⅲ:interpolate(limit_direction="both"):中间值
5.处理分析数据:
Ⅰ:apply()函数:
s对象调用apply(函数名)函数: 每个元素依次传递到apply中函数,依次执行
df对象调用apply(函数名)函数: 每个s对象依次传递到apply中函数,依次执行
# 导包
import pandas as pd
import numpy as np
# 1.先定义函数
def func1(x, n=2):
return x + n
def func2(x, n=2):
return x - n
def func3(x, n=2):
return x * n
def func4(x, n=2):
return x / n
# 2.创建s对象
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
# 3.创建df对象
df = pd.DataFrame({'A': [10, 20, 30], 'B': [40, 50, 60], 'C': [70, 80, 90]})
# 4.df应用apply函数
# 注意: 默认func函数拿到的第一个参数是Series对象
df.apply(func1, n=3)
#%%
# 5.s应用apply函数
# 注意: 默认func函数拿到的第一个参数是Series中每个元素
s.apply(func1, n=3)
Ⅱ:分组聚合_转换_过滤:
① 分组聚合语法:
df对象.groupby('分组字段')['聚合字段'].聚合函数名()
df对象.groupby('分组字段').聚合字段.聚合函数名()
df对象.groupby(['分组字段','分组字段'])[['聚合字段','聚合字段']].聚合函数名()
df对象.groupby(['分组字段','分组字段']).agg({'聚合字段':'聚合函数名','聚合字段':'聚合函数名'})
df对象.groupby(['分组字段','分组字段']).聚合字段.agg(['聚合函数名','聚合函数名'])
df对象.groupby(['分组字段','分组字段']).聚合字段.agg('聚合函数名')
agg函数的优点是可以同时使用多个聚合函数
Ⅱ:转换:
# 加载文件
df = pd.read_csv("data/gapminder.tsv", sep='\t')
df[df.year == 1952] # 142条数据
# 需求: 求1952年的平均寿命
# 方式1: 原来的agg得到结果就1个
df[df.year == 1952].groupby('year').lifeExp.agg(my_mean)
# 方式2: transform得到的结果是142个
df[df.year == 1952].groupby('year').lifeExp.transform(my_mean)
transfrom()和agg()的区别:
agg(): 多个内容聚合产生一个结果
transfrom(): 多个内容聚合产生多个结果,保证输出的记录数和输入的记录数一致
Ⅲ:过滤:
# 1.加载数据
df = pd.read_csv("data/tips.csv", sep=',')
#%%
# 2.了解数据
df.info()
df.head()
df.groupby('sex').count()
#%%
# 3.分析数据
# 需求1: 查看用餐人数分布
df.groupby('size').count()
#%%
# 需求2: 把分组后统计用餐人数小于等于30的数据过滤掉
# 注意: filter()函数的功能是传入一个返回布尔值的函数,自动判断出True和False,最后自动过滤掉False的数据,返回True的数据
new_df = df.groupby('size').filter(lambda x: x['size'].count() > 30)
#%%
# 验证需求2的结果是否已经把size是1,5,6的数据过滤了
new_df['size'].value_counts()
函数:filter(产生布尔结果的表达式)
如果结果是True,数据就保留
如果结果是False,数据就被过滤掉
6.透视表:
数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等,所进行的计算与数据跟数据透视表中的排列有关。Pandas也提供了透视表功能,对应的API为pivot_table
Ⅰ:pandas有两个pivot_table函数 :
pandas.pivot_table 和 pandas.DataFrame.pivot_table
pandas.pivot_table 比 pandas.DataFrame.pivot_table 多了一个参数data,data就是一个dataframe,实际上这两个函数相同
Ⅱ:pivot_table参数中最重要的四个参数 :
- index: 分组字段,行索引。传入原始数据的列名, 这一列中每个取值会作为透视表结果的1个行索引.
- columns: 列索引, 如果index有多个分组字段,可以用columns指定,展示效果会更加可视化
- values: 聚合字段
- aggfunc: 聚合函数
# 1.加载数据
df = pd.read_csv("data/tips.csv", sep=',')
# 需求: 使用透视表计算每个性别,每个时间点,平均人数
# 方式1: index中直接指定多个分组字段,values中指定要聚合的字段,aggfunc指定聚合函数
df.pivot_table(index=['sex', 'time'], values='size', aggfunc='mean')
size
sex time
Female Dinner 2.461538
Lunch 2.457143
Male Dinner 2.701613
Lunch 2.363636
# 方式2: 把index中其中一个分组字段,放到columns中,values中指定要聚合的字段,aggfunc指定聚合函数
df.pivot_table(index='sex', columns='time', values='size', aggfunc='mean')
time Dinner Lunch
sex
Female 2.461538 2.457143
Male 2.701613 2.363636