• Pandas学习笔记


    References:


    Pandas中的数据对象

    # coding=utf-8
    import panda as pd
    import numpy as np
    pd.__version__
    
    '0.20.3'
    

    Series对象

    Pandas最基本的对象,由两个数组组成:

    • index:标签信息,若创建时不指定index,会自动创建。
    • values: 保存元素值的ndarray数组
    #help(pd.Series)
    s = pd.Series([1,2,3,4,5], index=['a','b','c','d','e'])
    print(s.index)
    print(s.values)
    s.name='abc'
    print(s.name)
    #created without index
    a = pd.Series([1,2,3,4])
    print(a.index)
    
    Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
    [1 2 3 4 5]
    abc
    RangeIndex(start=0, stop=4, step=1)
    

    访问:同时支持位置和标签形式

    print(s)
    print('s[0]:', s[0])
    print('s[b]:', s['b'])
    s[0] += 1
    print('s[0]:', s[0])
    
    a    1
    b    2
    c    3
    d    4
    e    5
    Name: abc, dtype: int64
    s[0]: 1
    s[b]: 2
    s[0]: 2
    

    切片:支持位置切片和标签切片。

    位置切片:包括起始位置,不包括结束位置;

    标签切片:同时包括起始标签和结束标签。

    print(s)
    print(s[1:3])
    print(s['b':'d'])
    s[1:3] *= 2
    print(s[1:3])
    
    a    2
    b    2
    c    3
    d    4
    e    5
    Name: abc, dtype: int64
    b    2
    c    3
    Name: abc, dtype: int64
    b    2
    c    3
    d    4
    Name: abc, dtype: int64
    b    4
    c    6
    Name: abc, dtype: int64
    

    操作符运算:会对标签相同的两个元素进行计算,一方标签不存在时,会以nan填充(float64)。

    a = pd.Series([1,2,3,4], index=['a','b','c','d'])
    b = pd.Series([2,3,4,5], index=['b','c','d','e'])
    c = a+b
    c
    
    a    NaN
    b    4.0
    c    6.0
    d    8.0
    e    NaN
    dtype: float64
    

    在pandas中用函数 isnull 和 notnull 来检测数据丢失

    print(pd.isnull(c))
    print(pd.isnull(c[0]))
    print(pd.notnull(c))
    
    a     True
    b    False
    c    False
    d    False
    e     True
    dtype: bool
    True
    a    False
    b     True
    c     True
    d     True
    e    False
    dtype: bool
    

    DataFrame 对象

    一个Datarame表示一个表格,类似电子表格的数据结构,包含一个经过排序的列表集,它们没一个都可以有不同的类型值(数字,字符串,布尔等等)。Datarame有行和列的索引;它可以被看作是一个Series的字典(每个Series共享一个索引)。与其它你以前使用过的(如 R 的 data.frame )类似Datarame的结构相比,在DataFrame里的面向行和面向列的操作大致是对称的。在底层,数据是作为一个或多个二维数组存储的,而不是列表,字典,或其它一维的数组集合。

    用DataFrame()函数将内存中的数据转换为DataFrame 对象

    DataFrame()有三个参数:data,index,columns,data可以是字典或者二维数组
    1.用字典创建DataFrame 对象:

    这是定义一个 DataFrame 对象的常用方法——使用 dict 定义。字典的“键”("name","marks","price")就是 DataFrame 的 columns 的值(名称),字典中每个“键”的“值”是一个列表,它们就是那一竖列中的具体填充数据。上面的定义中没有确定索引,所以,按照惯例就是从 0 开始的整数。

    data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
            'year': [2000, 2001, 2002, 2001, 2002],
            'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
    frame = pd.DataFrame(data)
    frame
    
    pop state year
    0 1.5 Ohio 2000
    1 1.7 Ohio 2001
    2 3.6 Ohio 2002
    3 2.4 Nevada 2001
    4 2.9 Nevada 2002

    DataFrame 对象拥有行索引(可以有多级索引)index和列索引columns

    print(frame.index)
    print(frame.columns)
    print(frame.index[0])
    print(frame.columns[2])
    
    RangeIndex(start=0, stop=5, step=1)
    Index(['pop', 'state', 'year'], dtype='object')
    0
    year
    

    给一个不存在的列赋值,将会创建一个新的列。 像字典一样 del 关键字将会删除列:

    frame['day'] = 1
    print(frame)
    del frame['day']
    print(frame)
    
       pop   state  year  day
    0  1.5    Ohio  2000    1
    1  1.7    Ohio  2001    1
    2  3.6    Ohio  2002    1
    3  2.4  Nevada  2001    1
    4  2.9  Nevada  2002    1
       pop   state  year
    0  1.5    Ohio  2000
    1  1.7    Ohio  2001
    2  3.6    Ohio  2002
    3  2.4  Nevada  2001
    4  2.9  Nevada  2002
    

    2.用ndarray创建DataFrame 对象:

    frame2 = pd.DataFrame(np.random.randint(0, 10, (4, 2)), index=['A','B','C','D'], columns=['a','b'])
    frame2
    
    a b
    A 0 7
    B 2 3
    C 6 6
    D 4 8

    Index 对象

    Index 对象保存索引标签数据,可以当作一维数组,但它是只读的。

    可以通过values属性获得保存标签的数组

    index = frame.columns
    print(index)
    print(index.values)
    
    Index(['pop', 'state', 'year'], dtype='object')
    ['pop' 'state' 'year']
    

    Index 对象也有字典的映射功能,将值映射到键的位置:

    print(index.get_loc('state'))
    print(index.get_indexer(['state', 'year']))
    
    1
    [1 2]
    

    Multindex 对象

    pass

    下标存取

    [ ]操作符

    A = pd.DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'],
                     columns=['Ohio', 'Texas', 'California'])
    print(A)
    
       Ohio  Texas  California
    a     0      1           2
    c     3      4           5
    d     6      7           8
    
    • 单个索引标签: 获取对应的,返回一个Series对象:name是列索引名,index是行索引,values是数值。

      在此基础上,使用两个[col][row]时可返回对应位置的元素

      行索引可以用标签也可以用整数索引,列索引只能用标签索引
    print(A['Ohio'])
    print(A['Ohio'].index)
    print(A['Ohio'].values)
    print(A['Ohio'].name)
    print(A['Ohio']['c'])
    print(A['Ohio'][2])
    #error:print(A[0][2])
    
    a    0
    c    3
    d    6
    Name: Ohio, dtype: int64
    Index(['a', 'c', 'd'], dtype='object')
    [0 3 6]
    Ohio
    3
    6
    
    • 多个索引标签: 获取以列表、数组表示的多个标签对应的,返回一个DataFrame 对象。
    print(A[['Ohio', 'Texas']])
    
       Ohio  Texas
    a     0      1
    c     3      4
    d     6      7
    
    • 整数切片:以整数下标获取切片对应的,不包含终值的行。
    print(A[0:2])
    
       Ohio  Texas  California
    a     0      1           2
    c     3      4           5
    
    • 标签切片:当使用标签作为切片时包含终值。
    print(A['a':'c'])
    
       Ohio  Texas  California
    a     0      1           2
    c     3      4           5
    
    • 布尔数组:获取数组中 True 对应的行。
    print(A[A.Ohio>0])
    
       Ohio  Texas  California
    c     3      4           5
    d     6      7           8
    
    • 布尔DataFrame: 将 DataFhime对象中 False 对应的元素设置为 NaN 。
    print(A[A>2])
    
       Ohio  Texas  California
    a   NaN    NaN         NaN
    c   3.0    4.0         5.0
    d   6.0    7.0         8.0
    

    loc[ ]和.iloc[ ]存取器

    .loc[ ]使用标签下标,.iloc[ ]使用整数下标,.ix[]可以混用。

    下标对象是一个元组,有两个对象与行,列两个轴对应,若只有一个对象则对应[行,:],注:[:,列]是不可行的

    每个轴的下标对象支持单个标签、多标签列表、标签切片以及布尔数组。

    array=np.arange(16).reshape((4, 4))
    B = pd.DataFrame(array, index=['a', 'c', 'd','e'],
                     columns=['A', 'B', 'C', 'D'])
    print(B)
    print(B.loc['a':'d'])
    # print(array[:,1])
    # error:print(B.loc[:,'B'])
    
    print(B.loc['a':'d','B':'C'])
    print(B.loc['a':'d',['B','D']])
    
    # bool
    print(B.loc['a':'d',['B','D']])
    print(B.loc[B.C>3,['B','D']])
    
        A   B   C   D
    a   0   1   2   3
    c   4   5   6   7
    d   8   9  10  11
    e  12  13  14  15
       A  B   C   D
    a  0  1   2   3
    c  4  5   6   7
    d  8  9  10  11
       B   C
    a  1   2
    c  5   6
    d  9  10
       B   D
    a  1   3
    c  5   7
    d  9  11
       B   D
    a  1   3
    c  5   7
    d  9  11
        B   D
    c   5   7
    d   9  11
    e  13  15
    

    获取单个值

    .at[]和.iat[]分别使用标签和整数下标获取单个值,此外 get_value()与.at[]类似,不过其执行速度要快一些:

    print(B.at['c', 'B'])
    print(B.iat[1, 1])
    print(B.get_value('c', 'B'))
    
    5
    5
    5
    

    query()方法

    当需要根据一定的条件对行进行过滤吋,通常可以先创建一个布尔数组,使用该数组获取 True 对应的行:
    可以使用先前的[ ]运算符使用~、&、|等位运算符,也可以采用query()使用 not and or等关键字。

    print(B[(B.B > 1) & (B.D < 15)])
    print(B.query("B > 1 and D < 15"))
    
       A  B   C   D
    c  4  5   6   7
    d  8  9  10  11
       A  B   C   D
    c  4  5   6   7
    d  8  9  10  11
    

    文件的输入输出

    API-Input/Output

    读取CSV

    # 使用chunksize迭代读取
    list = []
    table_reader = pd.read_csv('A.csv',encoding='utf-8',chunksize=10)
    print(type(table_reader))
    for tb in table_reader:
        list.append(tb)
    print(list[0])
    
    <class 'pandas.io.parsers.TextFileReader'>
                     姓名   地区 性别  年龄  身高cm 婚姻状况 文化程度  单位类型   住房情况        收入(元)  
    0  林小姐     ID 15893  晋安区  女  32   164   未婚   本科  私营企业     其他    3001-5000   
    1  吴女士     ID 15883   福州  女  33   166   离婚   大专  事业单位    已购房  20001-50000   
    2  吴小姐     ID 15842  鼓楼区  女  28   155   未婚   大专  事业单位    已购房    2001-3000   
    3  欧先生     ID 15777   江西  男  35   171   离婚   本科  外企企业    已购房  10001-20000   
    4  陈小姐     ID 15117  仓山区  女  30   163   未婚   本科  事业单位  与父母同住    5001-8000   
    5  郑女士     ID 15115  鼓楼区  女  34   161   离婚   硕士  私营企业  与父母同住         5000   
    6  媛女士     ID 15114  鼓楼区  女  32   165   离婚   本科  事业单位  与父母同住         5000   
    7  潘先生     ID 15113  仓山区  男  35   172   离婚   大专  私营企业    已购房         8000   
    8  林小姐     ID 15075  仓山区  女  30   165   未婚   本科  事业单位    已购房        10000   
    9  黄先生     ID 15068  鼓楼区  男  28   172   未婚   本科  国有企业    多套房         7000   
    
       年龄差下限  年龄差上限 地区.1   身高下限   身高上限 文化程度.1 住房情况.1 婚姻状况.1       收入  
    0    0.0    5.0  本市区  170.0  180.0     大专    已购房     未婚   5000.0  
    1    0.0   10.0  本市区  170.0  180.0     大专    已购房     离婚   8000.0  
    2    0.0    5.0  本市区  168.0  170.0     大专    已购房     未婚   5000.0  
    3    NaN    NaN  NaN    NaN    NaN    NaN    NaN    NaN      NaN  
    4    0.0    5.0  本市区  170.0  180.0     大专    已购房     未婚   5000.0  
    5    0.0    5.0  本市区  170.0  180.0     本科    已购房     离婚   5000.0  
    6    0.0    5.0  本市区  170.0  180.0     大专    已购房     未婚   5000.0  
    7    0.0   10.0  本市区  158.0  165.0     中专     不限     离婚   3000.0  
    8    0.0    5.0  本市区  173.0  185.0     大专    已购房     未婚  10000.0  
    9    0.0    5.0  本市区  160.0  165.0     大专    已购房     未婚   3000.0  
    
    # 正常读取返回一个DataFrame对象
    table = pd.read_csv('A.csv',encoding='utf-8')
    print(type(table))
    print(table.loc[1])
    
    <class 'pandas.core.frame.DataFrame'>
    姓名        吴女士     ID 15883
    地区                      福州
    性别                       女
    年龄                      33
    身高cm                   166
    婚姻状况                    离婚
    文化程度                    大专
    单位类型                  事业单位
    住房情况                   已购房
    收入(元)          20001-50000
    年龄差下限                    0
    年龄差上限                   10
    地区.1                   本市区
    身高下限                   170
    身高上限                   180
    文化程度.1                  大专
    住房情况.1                 已购房
    婚姻状况.1                  离婚
    收入                    8000
    Name: 1, dtype: object
  • 相关阅读:
    项目中openlayer中使用,完整解决方案(数据库矢量数据,动态更新,分层,编辑)
    openlayer
    关于splitViewController自己的总结....
    GIS底层开发总结
    判断联网 phone
    nsdate 前一天 后一天
    ObjectiveC 字符处理函数 全 substring indexof
    oracle
    Windows Xp上跑IIS5.1x 用户访问过多出错
    Jquery中替换节点的方法replaceWith()和replaceAll()
  • 原文地址:https://www.cnblogs.com/messier/p/8310366.html
Copyright © 2020-2023  润新知