美文网首页
python数据分析——pandas1

python数据分析——pandas1

作者: X_xxieRiemann | 来源:发表于2019-12-18 09:43 被阅读0次

    1.1 Pandas基本介绍

    Python Data Analysis LibraryPandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

    import numpy as np
    import pandas as pd
    

    pandas中有两种常用的基本结构

    • Series
      • 一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List很相近。Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
    • DataFrame
      • 二维的表格型数据结构。很多功能与R语言中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。

    1.2Pandas库的series类型

    一维Series 可以用一维列表初始化:

    s1 = pd.Series([1, 3, 5, np.nan, 6, 8])
    print(s1)
    # 0    1.0
    # 1    3.0
    # 2    5.0
    # 3    NaN
    # 4    6.0
    # 5    8.0
    # dtype: float64
    

    默认情况下,Series的下标都是数字(可以使用额外参数指定),类型是统一的。

    s2 = pd.Series([1, 3, 5, np.nan, 6, 8], index=['a', 'b', 'c', 'd', 'e', 'f'])
    print(s2)
    # a    1.0
    # b    3.0
    # c    5.0
    # d    NaN
    # e    6.0
    # f    8.0
    # dtype: float64
    

    索引一数据的行标签

    print(s1.index)
    # RangeIndex(start=0, stop=6, step=1)
    
    print(s2.index)
    # Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
    

    print(s2.values)
    # [ 1.  3.  5. nan  6.  8.]   np.array格式
    print(s2[0])
    # 1.0
    print(s2['a'])
    # 1.0
    

    切片操作,和numpy差不多

    print(s1[2:5])
    # c    5.0
    # d    NaN
    # e    6.0
    # dtype: float64
    

    索引赋值:

    s1.index.name = "索引"
    print(s1)
    # 索引
    # a    1.0
    # b    3.0
    # c    5.0
    # d    NaN
    # e    6.0
    # f    8.0
    # dtype: float64
    
    s1.index = list('abcdef')
    print(s1)
    # a    1.0
    # b    3.0
    # c    5.0
    # d    NaN
    # e    6.0
    # f    8.0
    # dtype: float64
    

    这时候的切片不再是左闭右开,下面的写法和s1[0:3]等价

    print(s1['a':'c'])
    # a    1.0
    # b    3.0
    # c    5.0
    # dtype: float64
    

    1.3Pandas库的DataFrame类型

    DataFrame则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:

    data = pd.date_range('20190101', periods=6)
    print(data)
    # DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
    # #                '2019-01-05', '2019-01-06'],
    # #               dtype='datetime64[ns]', freq='D')
    

    然后创建一个DataFrame结构:

    df = pd.DataFrame(np.random.randn(6, 4))
    print(df)
    #           0         1         2         3
    # 0  1.021006  1.765719  1.776930  0.033001
    # 1  0.078115 -0.784737  0.261904  0.853981
    # 2  0.137149 -0.264794 -1.064713 -0.611104
    # 3  1.691658  0.060301 -0.448528 -0.206958
    # 4 -1.129160 -1.446600  0.387408  0.915638
    # 5  1.553429  0.541750  1.135685 -0.314485
    df = pd.DataFrame(np.random.randn(6, 4), index=data, columns=list('ABCD'))
    print(df)
    #                    A         B         C         D
    # 2019-01-01 -0.403110 -0.676936 -1.597137 -1.726338
    # 2019-01-02  0.821402  1.227160 -0.369561 -2.206953
    # 2019-01-03 -0.492121  0.882169  0.834621 -0.110336
    # 2019-01-04  1.567487 -1.213019  0.337903  0.756485
    # 2019-01-05  2.359838 -1.142287 -0.164322 -0.598946
    # 2019-01-06  0.359499  2.503660 -0.989103  0.229999
    

    默认情况下,如果不指定index参数和columns,那么他们的值将用从0开始的数字替代。
    除了向DataFrame中传入二维数组,我们也可以使用字典传入数据:

    df2 = pd.DataFrame({'A': 1., 'B': pd.Timestamp('20190101'),
                        'C': pd.Series(1, index=list(range(4)), dtype=np.float),
                        'D': np.array([3]*4, dtype=np.int),
                        'E': pd.Categorical(['test', 'train', 'test', 'train']),
                        'F': 'abc'})
    print(df2)
    #      A          B    C  D      E    F
    # 0  1.0 2019-01-01  1.0  3   test  abc
    # 1  1.0 2019-01-01  1.0  3  train  abc
    # 2  1.0 2019-01-01  1.0  3   test  abc
    # 3  1.0 2019-01-01  1.0  3  train  abc
    
    print(df2.dtypes)
    # A           float64
    # B    datetime64[ns]
    # C           float64
    # D             int32
    # E          category
    # F            object
    # dtype: object
    

    字典的每个key代表一列,其value可以是各种能够转化为Series的对象。
    与Series 要求所有的类型都一致不同,DataFrame只要求每一列数据的格式相同:

    查看数据

    头尾数据

    headtail方法可以分别查看最前面几行和最后面几行的数据(默认为5):

    print(df.head())
    #                    A         B         C         D
    # 2019-01-01 -1.304602  2.043264 -2.365490  0.348898
    # 2019-01-02 -0.332710 -0.836310  0.391643 -0.713681
    # 2019-01-03  1.315738 -1.694673  1.071747 -0.496341
    # 2019-01-04  0.043809  0.508175 -1.230306 -0.593911
    # 2019-01-05  1.323222 -1.002346  1.038059 -0.171501
    

    最后3行:

    print(df.tail(3))
    #                    A         B         C         D
    # 2019-01-04  1.523261 -0.263010  0.913391  0.912008
    # 2019-01-05 -0.894510  0.993565  0.141227  0.056933
    # 2019-01-06  0.844139  0.185704 -0.070343  1.446769
    
    下标,列标,数据

    下标使用index属性查看:

    print(df.index)
    # DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
    #                '2019-01-05', '2019-01-06'],
    #               dtype='datetime64[ns]', freq='D')
    

    列标使用columns属性查看:

    print(df.columns)
    # Index(['A', 'B', 'C', 'D'], dtype='object')
    

    数据值使用values查看:

    print(df.values)
    # [[-0.58907961 -1.16911153  1.25560219 -0.49365279]
    #  [-3.51588889 -0.62920317 -0.53742163 -0.22376674]
    #  [ 0.70458103  0.17104868 -1.32613727  0.83896575]
    #  [-0.52785699  1.87123803  0.87222562 -0.35988083]
    #  [ 0.67600155  0.63398791  0.23750621  0.72273571]
    #  [-0.3841158   0.52155693 -0.36270402 -0.48221057]]
    

    1.4 Pandas读取数据及数据操作

    我们将以豆瓣的电影数据作为我们深入了解Pandas的一个示例。


    本地数据
    df = pd.read_excel('豆瓣电影数据.xlsx')
    print(df.head())
           名字      投票人数        类型    产地                 上映时间   时长    年代   评分  \
    # 0  肖申克的救赎  692795.0     剧情/犯罪    美国  1994-09-10 00:00:00  142  1994  9.6   
    # 1    控方证人   42995.0  剧情/悬疑/犯罪    美国  1957-12-17 00:00:00  116  1957  9.5   
    # 2   美丽人生   327855.0  剧情/喜剧/爱情   意大利  1997-12-20 00:00:00  116  1997  9.5   
    # 3    阿甘正传  580897.0     剧情/爱情    美国  1994-06-23 00:00:00  142  1994  9.4   
    # 4    霸王别姬  478523.0  剧情/爱情/同性  中国大陆  1993-01-01 00:00:00  171  1993  9.4   
    # 
    #      首映地点  
    # 0  多伦多电影节  
    # 1      美国  
    # 2     意大利  
    # 3   洛杉矶首映  
    # 4      香港  
    

    行操作

    # 显示第一行,
    print(df.iloc[0])
    # 名字                   肖申克的救赎
    # 投票人数                 692795
    # 类型                    剧情/犯罪
    # 产地                       美国
    # 上映时间    1994-09-10 00:00:00
    # 时长                      142
    # 年代                     1994
    # 评分                      9.6
    # 首映地点                 多伦多电影节
    # Name: 0, dtype: object
    

    也可以进行切片显示0到4行,print(df.iloc[0:5])
    也可以使用loc,功能类似,但是在切片的时候不再是左闭右开,比如:
    print(df.loc[0:5]),表示第0行到第5行。

    添加一行
    # 添加一行
    dit = {'名字': '复仇者联盟3', '投票人数': '12345',
           '类型': '科幻', '产地': '美国', '上映时间': '2018-05-04',
           '时长': '144', '年代': '2018', '评分': '8.5', '首映地点': '美国'}
    s = pd.Series(dit)
    s.name = 38738  #新的最后一行
    print(s)
    # 上映时间    2018-05-04
    # 产地              美国
    # 名字          复仇者联盟3
    # 年代            2018
    # 投票人数         12345
    # 时长             144
    # 类型              科幻
    # 评分             8.5
    # 首映地点            美国
    # Name: 38738, dtype: object
    df = df.append(s)
    print(df.tail(1))
    #            名字   投票人数  类型  产地 上映时间   时长    年代   评分 首映地点
    # 38738  复仇者联盟3  12345  科幻  美国  2018-05-04  144  2018  8.5   美国
    
    删除一行
    df = df.drop([38738])
    print(df.tail(1))
    # 名字 投票人数     类型  产地  \
    # 38737  列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...   32  剧情/战争  苏联   
    # 
    #                       上映时间  时长    年代   评分 首映地点  
    # 38737  1905-05-30 00:00:00  97  1977  6.6   美国 
    

    列操作

    print(df.columns)
    # Index(['名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分', '首映地点'], dtype='object')
    
    print(df['名字'][:5])
    # 0    肖申克的救赎
    # 1      控方证人
    # 2     美丽人生 
    # 3      阿甘正传
    # 4      霸王别姬
    
    print(df[['名字', '类型']][:5])
    #        名字        类型
    # 0  肖申克的救赎     剧情/犯罪
    # 1    控方证人  剧情/悬疑/犯罪
    # 2   美丽人生   剧情/喜剧/爱情
    # 3    阿甘正传     剧情/爱情
    # 4    霸王别姬  剧情/爱情/同性
    
    增加一列
    df['序号'] = range(1, len(df)+1)
    print(df[:5])
    #        名字    投票人数        类型    产地                 上映时间   时长    年代   评分  \
    # 0  肖申克的救赎  692795     剧情/犯罪    美国  1994-09-10 00:00:00  142  1994  9.6   
    # 1    控方证人   42995  剧情/悬疑/犯罪    美国  1957-12-17 00:00:00  116  1957  9.5   
    # 2   美丽人生   327855  剧情/喜剧/爱情   意大利  1997-12-20 00:00:00  116  1997  9.5   
    # 3    阿甘正传  580897     剧情/爱情    美国  1994-06-23 00:00:00  142  1994  9.4   
    # 4    霸王别姬  478523  剧情/爱情/同性  中国大陆  1993-01-01 00:00:00  171  1993  9.4   
    # 
    #      首映地点  序号  
    # 0  多伦多电影节   1  
    # 1      美国   2  
    # 2     意大利   3  
    # 3   洛杉矶首映   4  
    # 4      香港   5  
    
    删除一列
    df = df.drop('序号', axis=1)
    

    相关文章

      网友评论

          本文标题:python数据分析——pandas1

          本文链接:https://www.haomeiwen.com/subject/muhqiqtx.html