综合练习

  1. Pandas缺失值处理
    如何进行缺失值处理

    1. 删除含有缺失值的样本
    2. 替换/插补

    如何处理nan

    1. 判断数据中存在NaN
      pd.isnull(df)
      pd.notnull(df)

    2. 删除含有缺失值的样本

      df.dropna(inplace=False)

    3. 替换/插补
      df.fillna(value, inplace= False)

    4. 不是缺失值nan,有默认标记的

      #判断是否有缺失值
      import pandas as pd
      import numpy as np
      movie = pd.read_csv("IMDB-Movie-Data.csv")
      pd.isnull(movie)
      np.any(pd.isnull(movie))  #返回ture,说明数据中存在缺失值
      np.all(pd.notnull(movie))  #返回False,说明数据中存在缺失值
      pd.isnull(movie).any()   #每一个列字段是否存在缺失值,存在返回true
      pd.notnull(movie).all()   #是否列的所有字段都不空
      #2)删除含有缺失值的样本
      datal = movie.dropna()
      np.all(pd.notnull(movie))  #返回False,已经没有空值
      #方法二,替换,利用平均值进行替换
      #含有缺失值的字段
      movie["Revenue (Millions)"].fillna(movie["Revenue (Millions)"].mean(), inplace= True)
       movie["Metascore"].fillna(movie["Metascore"].mean(), inplace= True)
      pd.isnull(movie).any()  #所有列返回False
      
      
  2. 数据离散化

    1. 定义:连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不用的符号或整数值代表落在每个子区间中的属性值,也成为one-hot编码,也成为哑变量

    ​ 性别 年龄

    ​ 1 23

    ​ 2 30

    ​ 1 18

    1. 步骤

      1. 分组
        1. 自动分组sr = pd.qcut(data, bins)
        2. 自定义分组pd.cut(data, [])
      2. 将分组的结果转化为one-hot编码
        1. pd.get_dummies(sr, perfix = )
    import pandas as pd
    #准备数据
    data = pd.Series([165, 174, 160, 180, 159, 163, 192, 184], index=['No1:165','No2:174','No3:160','No4:180','No5:159','No6:163','No7:192','No8:184'])
    #分组
    #自动分组
    sr = pd.qcut(data, 3)
    type(sr)
    #转化为one-hot编码
    pd.get_dummies(sr,prefix="height")
    #自定义分组
    bins = [150, 165,180, 195]
    sr = pd.cut(data, bins)
    sr.value_counts()
    #get_dummies
    pd.get_dummies(sr, prefix="身高")
    ###案例:对股票数据进行离散化,对每日的p_change进行离散化
    stock = pd.read_csv("stock_day.csv")
    p_change= stock["p_change"]
    #分组
    sr = pd.qcut(p_change, 10)
    #离散化
    pd.get_dummies(sr, prefix="涨跌幅")
    # 自定义分组
    bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
    sr = pd.cut(p_change, bins)
    sr.value_counts()
    #one-hot
    stock_change = pd.get_dummies(sr, prefix="rise")
    
  3. 合并

    ​ numpy

    ​ np.concatnate((a, b), axis = )

    1. 水平拼接

      ​ np.hstack()

    2. 竖直拼接

      ​ np.vstack()

    3. 按方向拼接

      1. 默认竖直拼接,想水平拼接axis设为1

      ​ pd.concat([data1, data2], axis = 1)

    4. 按索引进行拼接

    ​ pd.merge实现合并

    ​ pd.merge(left, right, how= “inner”, on=[])

     pd.concat([stock, stock_change], axis= 1)
     left = pd.DataFrame({'key1':['k0','k0','k1','k2'],'key2':['k0','k1','k0','k1'],'A':['a0','a1','a2','a3'],'b':['b0','b1','b2','b3']})
    right = pd.DataFrame({'key1':['k0','k1','k1','k2'],'key2':['k0','k0','k0','k0'],'c':['c0','c1','c2','c3'],'d':['d0','d1','d2','d3']})
    #内连接,左连接,右连接,外连接
    pd.merge(left, right, how="inner", on= ["key1", "key2"])
    
  4. 交叉表和透视表

    1. 交叉表:用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)

    ​ pd.crosstable(value1, value2)

    1. 透视表:DataFrame.pivot_table([], index = [])

      ### 交叉表与透视表
      #案例 :星期数据以及涨跌幅是好还是坏数据
      #pd.crosstab(星期数据列,涨幅数据列)
      stock.index
      #pandas日期类型
      date = pd.to_datetime(stock.index)
      date.weekday
      stock["week"] = date.weekday
      import numpy as np
      #准备涨跌幅数据类
      stock["pona"] = np.where(stock["p_change"] > 0, 1, 0)
      # 交叉表
      data = pd.crosstab(stock["week"], stock["pona"])
      data.sum(axis = 1)
      data.div(data.sum(axis = 1), axis = 0).plot(kind= "bar", stacked = True)
      #透视表操作
      stock.pivot_table(["pona"], index = ["week"])
      
  5. 分组与聚合

col = pd.DataFrame({'color':['white','red','green','red','green'], 'object':['pen','pencil','ashtray','pen','pencil'],'prince1':[5.56, 4.20, 1.30, 0.56, 2.75],'price2':[4.75, 4.12,1.60, 0.75, 3.15]})
#进行分组,对颜色分组,pencel进行聚合
#用dataframe的方法进行分组
col.groupby(by = "color")
#分组之后不会显示结果
#聚合
col.groupby(by="color")["prince1"].max()
col["prince1"].groupby(col["color"]).max()
#案例,星巴克零售店铺案例
starbucks =  pd.read_csv("directory.csv")
#按照国家分组,求出每个国家的星巴克零售店数据
starbucks.groupby("Country").count()["Brand"].sort_values(ascending = False)[:10].plot(kind="bar", figsize=(20, 8),fontsize=40)
#假设我们加入省市一起进行分组
starbucks.groupby(by=["Country", "State/Province"]).count()
  1. 综合案例

    import pandas as pd
    #1.准备数据
    movie = pd.read_csv("IMDB-Movie-Data.csv")
    #问题一,我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取
    #评分的平均分
    movie["Rating"].mean()
     import numpy as np
        #导演人数
    np.unique(movie["Director"]).size
    #问题2,对于这一组电影数据,想看rating,runtime的分布情况,应该如何呈现数据?
    movie["Rating"].plot(kind="hist", figsize=(20,8))
    import matplotlib.pyplot as plt
    #1.创建画布
    plt.figure(figsize=(20, 8), dpi= 80)
    #2.绘制直方图
    plt.hist(movie["Rating"], 21)
    #3.修改刻度
    plt.xticks(np.linspace(movie["Rating"].min(), movie["Rating"].max(), 20))
    #添加网格
    plt.grid(linestyle="--", alpha= 0.5)
    #4.显示图像
    plt.show()
    #先统计电影类别都有哪些
    movie_genre =  [i.split(",") for i in movie["Genre"]]
    movie_class = np.unique([j for i in movie_genre for j in i])
    #统计每个类别有几个电影
    count = pd.DataFrame(np.zeros(shape=[1000, 20], dtype="int32"), columns=movie_class)
    #计数填表
    for i in range(1000):
        count.loc[i, movie_genre[i]] = 1
        count.sum(axis= 0).sort_values(ascending=False).plot(kind = "bar", figsize=(20, 9), fontsize=40,colormap="cool")
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值