• Python数据挖掘Pandas



    1 DataFrame

    在这里插入图片描述

    • Pandas=panel+data+analysis
    • 专门用于数据挖掘的开源Python库
    • 以Numpy为基础,借力Numpy模块在计算方面性能高的优势
    • 基于matplotlib,能够简便的画图
    • 独特的数据结构
    • 便捷的数据处理能力
    • 读取文件方便
    • 封装了Matplotlib、Numpy的画图和计算

    核心数据结构

    • DataFrame (是series的容器,一般二维)
    • Panel(是dataframe的容器,三维)
    • Series(一维)

    1.1 构造dataframe 利用DataFrame函数

    • 索引:行索引-index,横向索引;列索引-columns,纵向索引
    • 值:values,利用values即可直接获得去除索引的数据(数组)
    • shape:表明形状 (形状不含索引的行列)
    • T:行列转置

    DataFrame是一个既有行索引又有列索引的二维数据结构

    import numpy as np
    import pandas as pd 
    a=np.ones((2,3))
    b=pd.DataFrame(a)
    print(a)
    print(b)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    如图,生成的打他frame是一个二维表,由于没有指定索引,因此默认行列索引为数字序号

    1.2 常用操作(设置索引)

    1. 获取局部展示
       b.head()#默认展示前5行,可在head()加入数字,展示前几行
       b.tail()#默认展示后5行,可在tail()加入数字,展示后几行
    
    • 1
    • 2
    1. 获取索引和值
    import  numpy as np
       # 创建一个符合正态分布的10个股票5天的涨跌幅数据
    stock_change = np.random.normal(0, 1, (10, 5))
    pd.DataFrame(stock_change)
    #设置行列索引
    stock = ["股票{}".format(i) for i in range(10)]
    date = pd.date_range(start="20200101", periods=5, freq="B")#这个是pandas中设置日期的
    # 添加行列索引
    data = pd.DataFrame(stock_change, index=stock, columns=date)
    print(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    1. 设置行列索引
    # 创建一个符合正态分布的10个股票5天的涨跌幅数据
    stock_change = np.random.normal(0, 1, (10, 5))
    pd.DataFrame(stock_change)
    #设置行列索引
    stock = ["股票{}".format(i) for i in range(10)]
    date = pd.date_range(start="20200101", periods=5, freq="B")#这个是pandas中设置日期的
    # 添加行列索引
    data = pd.DataFrame(stock_change, index=stock, columns=date)
    print(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    1. 修改索引

      #不能单独修改行列总某一个索引的值,可以替换整行或整列   例:b.index[2]='股票1'  错误
      data.index=新行索引
      #重设索引
      data.reset_index(drop=False)
      #drop参数默认为False,表示将原来的索引替换掉,换新索引为数字递增,原来的索引将变为数据的一部分。True表示,将原来的索引删除,更换为数字递增。如下图
      
      • 1
      • 2
      • 3
      • 4
      • 5
    # 设置新索引
    df = pd.DataFrame({'month': [1, 4, 7, 10],
                        'year': [2012, 2014, 2013, 2014],
                        'sale':[55, 40, 84, 31]})
    # 以月份设置新的索引
    df.set_index("month", drop=True)
    #见下图,即将原本数据中的一列拿出来作为index
    new_df = df.set_index(["year", "month"])# 设置多个索引,以年和月份   多个索引其实就是MultiIndex
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    可以看到下面的new_df已经是multiIndex类型数据了。

    有三级:index index.names index.levels

    分别看各自的输出

    1.3 MultiIndex与Panel

    MultiIndex:多级或分层索引对象

    Panel

    pandas.Panel(data=None,items=None,major_axis=None,minor_axis=None,copy=False,dtype=None)

    存储3维数组的Panel结构

    • items - axis 0,每个项目对应于内部包含的数据帧(DataFrame)。
    • major_axis - axis 1,它是每个数据帧(DataFrame)的索引(行)。
    • minor_axis - axis 2,它是每个数据帧(DataFrame)的列。
    p = pd.Panel(np.arange(24).reshape(4,3,2),
                     items=list('ABCD'),
                     major_axis=pd.date_range('20130101', periods=3),
                     minor_axis=['first', 'second'])
    p["A"]
    p.major_xs("2013-01-01")
    p.minor_xs("first")
    ###由于panel是三维数据,因此只能从某一个维度切入,可以理解为从立方体中抽出一个平面(dataframe)观察,则上面三行代码结果如下图;而series则是相当于从平面(dataframe)中抽出一行或一列来观察
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Pandas从版本0.20.0开始弃用,推荐的用于表示3D数据的方法是DataFrame上的MultiIndex方法

    1.4 Series

    带索引的一维数组

    • index
    • values
    # 创建
    pd.Series(np.arange(3, 9, 2), index=["a", "b", "c"])
    # 或
    pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
    
    sr = data.iloc[1, :]
    sr.index # 索引
    sr.values # 值
    
    #####就是从dataframe中抽出一行或一列来观察
    12345678910
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2 基本数据操作

    2.1 索引操作

    data=pd.read_csv("./stock_day/stock_day.csv")#读入文件的前5行表示如下
    ######利用drop删除某些行列,需要利用axis告知函数是行索引还是列索引
    data=data.drop(["ma5","ma10","ma20","v_ma5","v_ma10","v_ma20"], axis=1) # 去掉一些不要的列
    data["open"]["2018-02-26"] # 直接索引,但需要遵循先列后行
    
    #####按名字索引利用.loc函数可以不遵循列行先后关系
    data.loc["2018-02-26"]["open"] # 按名字索引
    data.loc["2018-02-26", "open"]
    
    
    #####利用.iloc函数可以只利用数字进行索引
    data.iloc[1][0] # 数字索引
    data.iloc[1,0]
    
    
    # 组合索引
    # 获取行第1天到第4天,['open', 'close', 'high', 'low']这个四个指标的结果
    data.ix[:4, ['open', 'close', 'high', 'low']] # 现在不推荐用了
    ###但仍可利用loc和iloc
    data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
    data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.2 赋值操作

    data仍然是上图类型

    data.open=100
    data['open']=100
    ###两种方式均可
    data.iloc[1,0]=100
    ###找好索引即可
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.3 排序

    • sort_values (比较values进行排序) sort_index (比较行索引进行排序,不行可以先转置简介对列排序)

      data.sort_values(by="high", ascending=False) # DataFrame内容排序,ascending表示升序还是降序,默认True升序
      
      data.sort_values(by=["high", "p_change"], ascending=False).head() # 多个列内容排序。给出的优先级进行排序
      
      data.sort_index(ascending=True)###对行索引进行排序
      
      #这里是取出了一列 “price_change”列,为serise,用法同上
      sr = data["price_change"]
      sr.sort_values(ascending=False)
      sr.sort_index()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

    2.4 数学运算 布尔值索引

    1. 算术运算:直接利用运算符或者函数

      #正常的加减乘除等的运算即可
      data["open"] + 3
      data["open"].add(3) # open统一加3  
      data.sub(100)# 所有统一减100 data - 100
      (data["close"]-(data["open"])).head() # close减open
      
      • 1
      • 2
      • 3
      • 4
      • 5
    2. 逻辑运算 :< ; > ; | ; & 利用逻辑符号或者函数query

      # 例如筛选p_change > 2的日期数据
      data[data["p_change"] > 2].head()
      # 完成一个多个逻辑判断, 筛选p_change > 2并且low > 15
      data[(data["p_change"] > 2) & (data["low"] > 15)].head()
      data.query("p_change > 2 & low > 15").head()###等效于上一行代码
      
      ###判断# 判断'turnover'列索引中是否有4.19, 2.39,将返回一列布尔值
      data["turnover"].isin([4.19, 2.39])##如下图
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    3. 利用布尔值索引,即利用一个布尔数组索引出True的数据

      ###判断# 判断'turnover'列索引中是否有4.19, 2.39,将返回一列布尔值
      data["turnover"].isin([4.19, 2.39])##如下图
      data[data["turnover"].isin([4.19, 2.39])]
      #这块就将返回turnover列布尔值为true的如下图,也就是筛选出turnover中值为4.19和2.39
      
      
      ###布尔值索引是一个很方便的数据筛选操作,比如:
      data[data["turnover"]>0.1]
      #也将筛选出turnover列中大于0.1的整体data数据,并不是说只返回turnover相关数据,判断只是返回布尔索引,利用索引的是data数据
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

    2.5 统计运算

    data.describe()
    #将返回关于列的最值,均值,方差等多种信息
    ##其实这里很多就和numpy相似了
    data.max(axis=0)#返回最值
    data.idxmax(axis=0) #返回最值索引
    
    • 1
    • 2
    • 3
    • 4
    • 5

    累计统计函数(累加,累乘等)

    • cumsum 计算前1/2/3/…/n个数的和
    • cummax 计算前1/2/3/…/n个数的最大值
    • cummin 计算前1/2/3/…/n个数的最小值
    • cumprod 计算前1/2/3/…/n个数的积

    自定义运算

    apply(func, axis=0)

    func: 自定义函数

    axis=0: 默认按列运算,axis=1按行运算

    data.apply(lambda x: x.max() - x.min())
    #这里的lambda x: x.max() - x.min()是lambda表达式,是函数的简单写法也可
    def fx(data):
    	return	data.max()-data.min()
    
    • 1
    • 2
    • 3
    • 4

    3 画图

    3.1 pandas.DataFrame.plot

    DataFrame.plot(x=None, y=None, kind=‘line’)

    • x: label or position, default None
    • y: label, position or list of label, positions, default None
      • Allows plotting of one column versus another
    • kind: str
      • ‘line’: line plot(default)
      • ''bar": vertical bar plot
      • “barh”: horizontal bar plot
      • “hist”: histogram
      • “pie”: pie plot
      • “scatter”: scatter plot
    #更简易用matplotlib
    data.plot(x="volume", y="turnover", kind="scatter")
    data.plot(x="high", y="low", kind="scatter")
    data['volume'].plot()
    
    • 1
    • 2
    • 3
    • 4

    4 文件读取写入

    4.1 CSV文件

    DataFrame.to_csv(path_or_buf=None,sep=','columns=None,header=True,index=True,index_label=None,mode='w',encoding=None)
    1
    
    • 1
    • 2
    • path_or_buf :string or file handle , default None
    • sep : character, default ‘,’(分隔符)
    • columns :sequence,optional
    • mode:'w‘:重写,'a’追加
    • index:是否写入 行索引
    • header:boolean or list of string,default True,是否写进列索引值
    Series.to_csv (path=None,index=True,sep=',',na_rep='',float_format=None,header=False,index_label=None,mode='w',encoding=None,compression=None,date_format=None,decimal='.)
    
    • 1
    • Write Series to a comma-separated values(csv)file
    pd.read_csv("./stock_day/stock_day.csv", usecols=["high", "low", "open", "close"]).head() # 读哪些列
    
    data = pd.read_csv("stock_day2.csv", names=["open", "high", "close", "low", "volume", "price_change", "p_change", "ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20", "turnover"]) # 如果列没有列名,用names传入
    
    data[:10].to_csv("test.csv", columns=["open"]) # 保存open列数据
    
    data[:10].to_csv("test.csv", columns=["open"], index=False, mode="a", header=False) # 保存opend列数据,index=False不要行索引,mode="a"追加模式|mode="w"重写,header=False不要列索引
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    csv可以用excel表格打开,但是可能有格式错误

    4.2 HDF5文件

    read_hdf to_hdf

    HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame,也就是说hdf5存储的是panel这种三维类型,一个key对应一个dataframe

    pandas.read_hdf(path_or_buf, key=None, **kwargs)

    从h5文件当中读取数据

    • path_or_buffer: 文件路径
    • key: 读取的键
    • mode: 打开文件的模式
    • reurn: The Selected object

    DataFrame.to_hdf(path_or_buf, key, **kwargs)

    day_close = pd.read_hdf("./stock_data/day/day_close.h5",key="close")
    day_close.to_hdf("test.h5",key="close" )
    
    • 1
    • 2

    4.3 JSON文件

    read_json to_json

    pandas.read_json(path_or_buf=None,orient=None,typ=“frame”,lines=False)

    • 将JSON格式转换成默认的Pandas DataFrame格式
    • orient: string,Indication of expected JSON string format.
      • ‘split’: dict like {index -> [index], columns -> [columns], data -> [values]}
      • ‘records’: list like [{column -> value}, …, {column -> value}]
      • ‘index’: dict like {index -> {column -> value}}
      • ‘columns’: dict like {column -> {index -> value}}, 默认该格式
      • ‘values’: just the values array
    • lines: boolean, default False
      • 按照每行读取json对象
    • typ: default ‘frame’,指定转换成的对象类型series或者dataframe
    sa = pd.read_json("Sarcasm_Headlines_Dataset.json", orient="records", lines=True)
    ##主要是path,orient是一种确定索引与数值的对应,以本例来看,列索引就是‘key’,values就是key对应的值
    sa.to_json("test.json", orient="records", lines=True)
    
    • 1
    • 2
    • 3

    本示例中按行存储,每行是一个字典,键 有’article_link’,'headline’等

    5 高级处理

    5.1 缺失值(标记值)处理

    主要参数

    • inplace实现数据替换(默认为False)
    • dropna实现缺失值的删除(默认删除行)
    • fillna实现缺失值的填充
    • isnull或notnull判断是否有缺失数据NaN

    如何进行缺失值处理?

    • 删除含有缺失值的样本
    • 替换/插补数据

    判断NaN是否存在

    • pd.isnull(df) 会返回整个dataframe的布尔框架,难以观察(bool为True代表那个位置是缺失值)
    • pd.isnull(df).any() 表示只要有一个True就返回True
    • pd.notnull(df)会返回整个dataframe的布尔框架,难以观察(bool为False代表那个位置是缺失值)
    • pd.notnull(df).all() 表示只要有一个False就返回False

    删除nan数据

    • df.dropna(inplace=True) 默认按行删除 inplace:True修改原数据,False返回新数据,默认False

    替换nan数据

    • df.fillna(value,inplace=True)

    • value替换的值

    • inplace:True修改原数据,False返回新数据,默认False

      movie["Revenue (Millions)"].fillna(movie["Revenue (Millions)"].mean(), inplace=True)
      ###这就是先利用其他代码判断出"Revenue (Millions)"有nan数据,然后利用.fillna函数,令value=movie["Revenue (Millions)"].mean()列的均值,然后inplace=True修改原数据
      
      • 1
      • 2
    import pandas as pd
    import numpy as np
    movie = pd.read_csv("./IMDB/IMDB-Movie-Data.csv")
    # 1)判断是否存在NaN类型的缺失值
    np.any(pd.isnull(movie)) # 返回True,说明数据中存在缺失值
    np.all(pd.notnull(movie)) # 返回False,说明数据中存在缺失值
    pd.isnull(movie).any()
    pd.notnull(movie).all()
    
    # 2)缺失值处理
    # 方法1:删除含有缺失值的样本
    data1 = movie.dropna()
    pd.notnull(data1).all()
    
    # 方法2:替换
    # 含有缺失值的字段
    # Revenue (Millions)    
    # Metascore
    movie["Revenue (Millions)"].fillna(movie["Revenue (Millions)"].mean(), inplace=True)
    movie["Metascore"].fillna(movie["Metascore"].mean(), inplace=True)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    替换非nan的标记数据

    有些数据不存在可能标记为“#”,“?”等

    # 读取数据
    path = "wisconsin.data"
    name = ["Sample code number",  "Normal Nucleoli","Mitoses", "Class"]
    data = pd.read_csv(path, names=name)
    
    #这里的非nan标记值缺失值就是利用“?”表示的,因此利用参数to_replace,value=np.nan,将默认标记值替换为nan值,然后再利用签署方法处理nan缺失值
    # 1)替换
    data_new = data.replace(to_replace="?", value=np.nan)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5.2 离散化

    这一块建议去看视频,理解更快:视频地址

    • 连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间的属性值。

    • 连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具。

    • 实现方法:

      1. 分组
        • 自动分组 sr = pd.qcut(data, bins)
        • 自定义分组 sr = pd.cut(data, [])
      2. 将分组好的结果转换成one-hot编码(哑变量)
        • pd.get_dummies(sr, prefix=)
    • one-hot编码:
      one-hot

      比如男女数据一般用1和0表示,但1和0本身有大小问题,而男女只是不同的概念,因此用1,0表示会存在区别

      (男:1 女:0)性别
      小明1
      小红0

      如果用one-hot表示一种方法可以是,相当于利用一种编码的方式表示

      编码
      小明101 0
      小红010 1

      同时还可处理连续数据,比如将身高的连续数据分为不同的身高区间,每个区间对应一个类别,然后类比同上来考虑

      # 1)准备数据
      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']) 
      # 2)分组
      # 自动分组
      sr = pd.qcut(data, 3)
      sr.value_counts()  # 看每一组有几个数据
      # 3)转换成one-hot编码
      pd.get_dummies(sr, prefix="height")
      
      # 自定义分组
      bins = [150, 165, 180, 195]#这就表示有三组[150,165][165,180][180,195]
      sr = pd.cut(data, bins)
      # get_dummies
      pd.get_dummies(sr, prefix="身高")
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

    5.3 合并

    指合并不同dataframe上的内容数据

    • 按方向

      pd.concat([data1, data2], axis=1) 
      #axis:0为列索引;1为行索引
      
      • 1
      • 2
    • 按索引

      merge函数参数API

      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"])
      pd.merge(left, right, how="left", on=["key1", "key2"])
      pd.merge(left, right, how="outer", on=["key1", "key2"])
      ###这里merge参数解释:
      #left: 需要合并的一个表,合并后在左侧
      #right:需要合并的一个表,合并后在右侧
      #how: 合并方式
      #on: 在哪些索引上进行合并
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16

    5.4交叉表与透视表

    1. 交叉表

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

      • pd.crosstab(value1, value2)

        data = pd.crosstab(stock["week"], stock["pona"])
        data.div(data.sum(axis=1), axis=0).plot(kind="bar", stacked=True)
        
        • 1
        • 2
    2. 透视表

      • 相对于交叉表操作简单些

        # 透视表操作
        stock.pivot_table(["pona"], index=["week"])
        
        • 1
        • 2

    5.6 分组与聚合

    • 分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况。

    • DataFrame.groupby(key, as_index=False) key:分组的列数据,可以多个

      col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})
      
      # 进行分组,对颜色分组,price1进行聚合
      # 用dataframe的方法进行分组
      col.groupby(by="color")
      
      # 或者用Series的方法进行分组聚合
      col["price1"].groupby(col["color"])
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

    6 案例

    要求

    1. 想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?
    2. 对于这一组电影数据,如果我们想看Rating,Runtime(Minutes)的分布情况,应该如何呈现数据?
    3. 对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何
      处理数据?

    数据结构展示

    数据网址

    在这里插入图片描述
    代码

    # 1、准备数据
    movie = pd.read_csv("./IMDB/IMDB-Movie-Data.csv")
    ###movie读入后如上图所示
    ######################问题一
    # 问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?
    # 评分的平均分
    movie["Rating"].mean()
    # 导演的人数
    np.unique(movie["Director"]).size
    
    ######################问题二
    ##绘制直方图查看分布
    movie["Rating"].plot(kind="hist", figsize=(20, 8))
    #利用matplotlib可更细致绘图
    import matplotlib.pyplot as plt
    # 1、创建画布
    plt.figure(figsize=(20, 8), dpi=80)
    # 2、绘制直方图
    plt.hist(movie["Rating"], 20)
    # 修改刻度
    plt.xticks(np.linspace(movie["Rating"].min(),movie["Rating"].max(), 21))
    # 添加网格
    plt.grid(linestyle="--", alpha=0.5)
    # 3、显示图像
    plt.show()
    
    
    ######################问题三
    ##如果我们希望统计电影分类(genre)的情况,应该如何处理数据?
    ###可以发现图中genre一列数据中每个电影都有多种标签,因此要先分割
    # 先统计电影类别都有哪些
    movie_genre = [i.split(",") for i in movie["Genre"]]
    ###得到的movie_genre结构图见《下图一》
    ###这一块主要是把movie_genre的二维列表变为以为列表,然后利用unique函数去重
    movie_class = np.unique([j for i in  movie_genre for j in i])
    len(movie_class)####这就得到了电影的类型标签种类数
    
    # 统计每个类别有几个电影
    count = pd.DataFrame(np.zeros(shape=[1000, 20], dtype="int32"), columns=movie_class)
    count.head()###得到的count结构如《下图二》
    # 计数填表
    for i in range(1000):
        count.ix[i, movie_genre[i]] = 1###注意ix现在不太能用了
        ############movie_genre[i]将返回字符索引列
    #这就得到了下面第三张图片的数据处理效果,列表示电影类型种类,行表示不同电影,如《下图三》
    #因此只需逐列求和即可得到每类标签电影的数量
    ##最终实现数据可视化如《下图四》
    count.sum(axis=0).sort_values(ascending=False).plot(kind="bar", figsize=(20, 9), fontsize=40, colormap="cool")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    FTP服务详解
    微信小程序实现美食检索功能
    Spring MVC
    Game101作业5以及光线追踪笔记
    matplotlib如何保存高分辨率图(亲测)
    布隆过滤器的优缺点及哈希切割问题
    网络空间开源威胁情报分析的人机优化策略研究
    acunetix wvs网站漏洞扫描 XSS CSOR处理
    C++数据结构(下):模拟实现红黑树
    谈一谈什么是接口测试?怎样做接口测试?
  • 原文地址:https://blog.csdn.net/ZGL_cyy/article/details/125724975