数据分析整体思路

总体思路为:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值