zoukankan      html  css  js  c++  java
  • 《利用python进行数据分析》读书笔记--第五章 pandas入门

    http://www.cnblogs.com/batteryhp/p/5006274.html

    pandas是本书后续内容的首选库。pandas可以满足以下需求:

    • 具备按轴自动或显式数据对齐功能的数据结构。这可以防止许多由于数据未对齐以及来自不同数据源(索引方式不同)的数据而导致的常见错误。.
    • 集成时间序列功能
    • 既能处理时间序列数据也能处理非时间序列数据的数据结构
    • 数学运算和简约(比如对某个轴求和)可以根据不同的元数据(轴编号)执行
    • 灵活处理缺失数据
    • 合并及其他出现在常见数据库(例如基于SQL的)中的关系型运算

    1、pandas数据结构介绍

    两个数据结构:Series和DataFrame。Series是一种类似于以为NumPy数组的对象,它由一组数据(各种NumPy数据类型)和与之相关的一组数据标签(即索引)组成的。可以用index和values分别规定索引和值。如果不规定索引,会自动创建 0 到 N-1 索引。

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    #Series可以设置index,有点像字典,用index索引
    obj = Series([1,2,3],index=['a','b','c'])
    #print obj['a']
    #也就是说,可以用字典直接创建Series
    
    dic = dict(key = ['a','b','c'],value = [1,2,3])
    dic = Series(dic)
    #下面注意可以利用一个字符串更新键值
    key1 = ['a','b','c','d']
    #注意下面的语句可以将 Series 对象中的值提取出来,不过要知道的字典是不能这么做提取的
    dic1 = Series(obj,index = key1)
    #print dic
    #print dic1
    #isnull 和  notnull 是用来检测缺失数据
    #print pd.isnull(dic1)
    #Series很重要的功能就是按照键值自动对齐功能
    dic2 = Series([10,20,30,40],index = ['a','b','c','e'])
    #print dic1 + dic2
    #name属性,可以起名字
    dic1.name = 's1'
    dic1.index.name = 'key1'
    #Series 的索引可以就地修改
    dic1.index = ['x','y','z','w']
    复制代码

    DataFrame是一种表格型结构,含有一组有序的列,每一列可以是不同的数据类型。既有行索引,又有列索引,可以被看做由Series组成的字典(使用共同的索引)。跟其他类似的数据结构(比如R中的data.frame),DataFrame面向行和列的操作基本是平衡的。其实,DataFrame中的数据是以一个或者多个二维块存放的(不是列表、字典或者其他)。

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    #构建DataFrame可以直接传入等长的列表或Series组成的字典
    #不等长会产生错误
    data = {'a':[1,2,3],
            'c':[4,5,6],
            'b':[7,8,9]
    }
    #注意是按照列的名字进行列排序
    frame = DataFrame(data)
    #print frame
    #指定列之后就会按照指定的进行排序
    frame = DataFrame(data,columns=['a','c','b'])
    print frame
    #可以有空列,index是说行名
    frame1 = DataFrame(data,columns = ['a','b','c','d'],index = ['one','two','three'])
    print frame1
    #用字典方式取列数据
    print frame['a']
    print frame.b
    #列数据的修改直接选出来重新赋值即可
    #行,可以用行名或者行数来进行选取
    print frame1.ix['two']
    #为列赋值,如果是Series,规定了index后可以精确赋值
    frame1['d'] = Series([100,200,300],index = ['two','one','three'])
    print frame1
    #删除列用del 函数
    del frame1['d']
    #警告:通过列名选出来的是Series的视图,并不是副本,可用Series copy方法得到副本
    复制代码

    另一种常见的结构是嵌套字典,即字典的字典,这样的结构会默认为外键为列,内列为行。

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    #内层字典的键值会被合并、排序以形成最终的索引
    pop = {'Nevada':{2001:2.4,2002:2.9},
           'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
    frame3 = DataFrame(pop)
    #rint frame3
    #Dataframe也有行和列有name属性,DataFrame有value属性
    frame3.index.name = 'year'
    frame3.columns.name = 'state'
    print frame3
    print frame3.values
    复制代码

    下面列出了DataFrame构造函数能够接受的各种数据。

    image

    索引对象

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    #pandas索引对象负责管理轴标签和其他元数据,构建Series和DataFrame时,所用到的任何数组或其他序列的标签都被转换为Index
    obj = Series(range(3),index = ['a','b','c'])
    index = obj.index
    #print index
    #索引对象是无法修改的,这非常重要,因为这样才会使得Index对象在多个数据结构之间安全共享
    index1 = pd.Index(np.arange(3))
    obj2 = Series([1.5,-2.5,0],index = index1)
    print obj2.index is index1
    
    #除了长得像数组,Index的功能也类似一个固定大小的集合
    print 'Ohio' in frame3.columns
    print 2003 in frame3.index
    复制代码

    pandas中的Index是一个类,pandas中主要的Index对象(什么时候用到)。

    image

    下面是Index的方法与属性,值得注意的是:index并不是数组。

    image

    2、基本功能

    下面介绍基本的Series 和 DataFrame 数据处理手段。首先是索引:

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from pandas import Series,DataFrame
    
    #Series有一个reindex函数,可以将索引重排,以致元素顺序发生变化
    
    obj = Series([1,2,3,4],index=['a','b','c','d'])
    #注意这里的reindex并不改变obj的值,得到的是一个“副本”
    #fill_value 显然是填充空的index的值
    #print obj.reindex(['a','c','d','b','e'],fill_value = 0)
    #print obj
    obj2 = Series(['red','blue'],index=[0,4])
    #method = ffill,意味着前向值填充
    obj3 = obj2.reindex(range(6),method='ffill')
    #print obj3
    
    #DataFrame 的reindex可以修改行、列或者两个都改
    frame = DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California'])
    #只是传入一列数,是对行进行reindex,因为...frame的行参数叫index...(我这么猜的)
    frame2 = frame.reindex(['a','b','c','d'])
    #print frame2
    #当传入原来没有的index是,当然返回的是空NaN
    #frame3 = frame.reindex(['e'])
    #print frame3
    states = ['Texas','Utah','California']
    #这是对行、列重排
    #注意:这里的method是对index 也就是行进行的填充,列是不能填充的(不管method的位置如何)
    frame4 = frame.reindex(index = ['a','b','c','d'],columns=states,method = 'ffill')
    #print frame4
    
    #使用ix的标签索引功能,重新索引变得比较简洁
    print frame.ix[['a','d','c','b'],states]
    复制代码

    关于ix,是DataFrame的一个方法,http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.ix.html

    image

    image

    丢弃指定轴上的项

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from pandas import Series,DataFrame
    #drop函数可以丢弃轴上的列、行值
    obj = Series(np.arange(3.),index = ['a','b','c'])
    #原Series并不丢弃
    obj.drop('b')
    #print obj
    #注意下面,行可以随意丢弃,列需要加axis = 1
    print frame.drop(['a'])
    print frame.drop(['Ohio'],axis = 1)
    复制代码

    下面说索引、选取和过滤

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from pandas import Series,DataFrame
    
    obj = Series([1,2,3,4],index=['a','b','c','d'])
    frame = DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California'])
    
    #Series切片和索引
    #print obj[obj < 2]
    #注意:利用标签的切片与python的切片不同,两端都是包含的(有道理)
    print obj['b':'c']
    #对于DataFrame,列可以直接用名称
    print frame['Ohio']
    #特殊情况:通过切片和bool型索引,得到的是行(有道理)
    print frame[:2]
    print frame[frame['Ohio'] != 0]
    #下面的方式是对frame所有元素都适用,不是行或者列,下面的得到的是numpy.ndarray类型的数据
    print frame[frame < 5],type(frame[frame < 5])
    frame[frame < 5] = 0
    print frame
    
    #对于DataFrame上的标签索引,用ix进行
    print frame.ix[['a','d'],['Ohio','Texas']]
    print frame.ix[2] #注意这里默认取行
    #注意下面默认取行
    print frame.ix[frame.Ohio > 0]
    #注意下面的逗号后面是列标
    print frame.ix[frame.Ohio > 0,:2]
    复制代码

    下面是常用的索引选项:

    image

    image

    算术运算和数据对齐

    复制代码
    #pandas 有一个重要的功能就是能够根据索引自动对齐,其中索引不重合的部分值为NaN
    s1 = Series([1,2,3],['a','b','c'])
    s2 = Series([4,5,6],['b','c','d'])
    #print s1 + s2
    df1 = DataFrame(np.arange(12.).reshape(3,4),columns=list('abcd'))
    df2 = DataFrame(np.arange(20.).reshape(4,5),columns=list('abcde'))
    #print df1 + df2
    #使用add方法,并传入填充值,注意下面的fill_value函数是先对应填充再进行加和,而不是加和得到NaN之后再填充
    #print df1.add(df2,fill_value = 1000)
    #df1.reindex(columns = df2.columns,fill_value=0)
    复制代码

    除了add之外,还有其他的方法:

    image

    DataFrame和Series之间的运算

    复制代码
    #下面看一下DataFrame和Series之间的计算过程
    arr = DataFrame(np.arange(12.).reshape((3,4)),columns = list('abcd'))
    #下面的结果标明,就是按行分别相减即可,叫做 broadcasting
    #注意:默认情况下,DataFrame和Series的计算会将Series的索引匹配到DataFrame的列,然后进行计算,再沿着行一直向下广播
    #注意:下面的式子中,如果写arr - arr[0]是错的,因为只有标签索引函数ix后面加数字才表示行
    print arr - arr.ix[0]
    Series2 = Series(range(3),index = list('cdf'))
    #按照规则,在不匹配的列会形成NaN值
    print arr + Series2
    #如果想匹配行且在列上广播,需要用到算术运算方法
    Series3 = arr['d']
    #axis就是希望匹配的轴
    print arr.sub(Series3,axis = 0)
    复制代码

    下面是函数应用和映射

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from pandas import Series,DataFrame
    
    #NumPy的元素级数组方法也适用于pandas对象
    frame = DataFrame(np.random.randn(4,3),columns = list('abc'),index = ['Ut','Oh','Te','Or'])
    print frame
    #下面是求绝对值:
    #print np.abs(frame)
    #另一种常见的做法是:将一个函数应用到行或者列上,用apply方法,与R语言类似
    fun = lambda x:x.max() - x.min()
    #默认是应用在每一列上
    print frame.apply(fun)
    #下面是应用在列上
    print frame.apply(fun,axis = 1)
    #很多统计函数根本不用apply,直接调用方法就可以了
    print frame.sum()
    #除了标量值之外,apply函数后面还可以接返回多个值组成的的Series的函数,有没有很漂亮?
    def f(x):
        return Series([x.min(),x.max()],index = ['min','max'])
    #print frame.apply(f)
    #元素级的python函数也是可以用的,但是要使用applymap函数
    format = lambda x: '%.2f' % x
    print frame.applymap(format)
    #之所以要用applymap是因为Series有一个应用于元素级函数的map方法??
    #这里的map很有用
    print frame['b'].map(format)
    复制代码

    排序与排名

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from pandas import Series,DataFrame
    #用sort_index函数对行、列的索引进行排序
    obj = Series(range(4),index = ['d','a','b','c'])
    print obj.sort_index()
    
    frame = DataFrame(np.arange(8).reshape((2,4)),index = ['three','one'],columns = ['d','a','b','c'])
    #默认是对行 “索引” 进行排序,如果对列 “索引” 进行排序,axis = 1 即可
    print frame.sort_index()
    print frame.sort_index(axis = 1)
    print frame.sort_index(axis = 1,ascending = False)
    
    #如果对值进行排序,用的是order函数,注意所有的缺失值会放到最后(如果有的话)
    print obj.order()
    #numpy中的sort也可以用来排序
    print np.sort(obj)
    #如果相对DataFrame的值进行排序,函数还是sort_index,只不过后面需要加一个参数by
    frame = DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})
    print frame.sort_index(by = ['a','b'])
    
    #rank函数返回从小到大排序的下标,对于平级的数,rank是通过“为各组分配一个平均排名”的方式破坏评级关系
    #下标从1开始
    obj = Series([7,-5,7,4,2,0,4])
    print obj.rank()
    #而numpy中的argsort函数比较奇怪,返回的是把数据进行排序之后,按照值得顺序对应的下标,下标从0开始
    print np.argsort(obj)
     #打印结果为:1,5,4,3,6,0,2 按照这个下标顺序恰好可以得到从小打到的值,见下面
    print obj[np.argsort(obj)]
    #rank函数中有一个method选项,用来规定下标的方式
    
    print obj.rank(method = 'first',ascending=False)
    print obj.rank(method = 'max',ascending=False)
    print obj.rank(method = 'min',ascending=False)
    
    #对于DataFrame,rank函数默认把每一列排好并返回坐标
    print frame.rank()
    print frame.rank(axis = 1)

    排名(Series.rank(method='average', ascending=True))的作用与排序的不同之处在于,他会把对象的 values 替换成名次(从 1 到 n)。这时唯一的问题在于如何处理平级项,方法里的method参数就是起这个作用的,他有四个值可选:average, min, max, first。


     

    注意在 ser[0]=ser[3] 这对平级项上,不同 method 参数表现出的不同名次。

    DataFrame 的.rank(axis=0, method='average', ascending=True)方法多了个 axis 参数,可选择按行或列分别进行排名,暂时好像没有针对全部元素的排名方法。



    文/tianmh(简书作者)
    原文链接:http://www.jianshu.com/p/d6992889e1e3
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
    复制代码

    带有重复值的轴索引

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from pandas import Series,DataFrame
    
    #虽然pandas的很多函数(如reindex)要求标签唯一,但是并不具有强制性
    obj = Series(range(5),index = list('aabbc'))
    print obj
    #索引是否唯一用is_unique看是否唯一
    print obj.index.is_unique
    #对于重复值的索引,选取的话返回一个Series,唯一的索引返回一个标量
    print obj['a']
    #对于DataFrame也是如此
    df = DataFrame(np.random.randn(4,3),index = list('aabb'))
    print df
    print df.ix['b']
    #####自己导入数据的时候数据处理之前可以做一下index唯一性等,自己创建DataFrame注意不能这样
    复制代码

    3、汇总和计算描述统计

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import time
    
    #pandas 对象拥有一组常用的数学和统计方法,大部分属于简约统计,用于从Series中提取一个值,或者   从DataFrame中提取一列或者一行Series
    #注意:与NumPy数组相比,这些函数都是基于没有缺失数据的建设构建的,也就是说:这些函数会自动忽略缺失值。
    df = DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index = list('abcd'),columns=['one','two'])
    print df.sum()
    print df.sum(axis = 1)
    #下面是一些函数,idxmin 和 idmax 返回的是达到最小或者最大的索引
    print df.idxmin()
    print df.idxmin(axis=1)
    #关于累积型的函数
    print df.cumsum()
    #describe函数,与R语言中的describe函数基本相同
    print df.describe()
    #对于非数值型的数据,看看下面的结果
    
    obj = Series(['c','a','a','b','d'] * 4)
    print obj.describe()
    '''
    结果为:
    count     20
    unique     4
    top        a
    freq       8
    其中,freq是指字母出现的最高频率
    '''
    复制代码

    image

    image

    image

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import time
    
    #下面看一下cummin函数
    #注意:这里的cummin函数是截止到目前为止的最小值,而不是加和以后的最小值
    frame = DataFrame([[1,2,3,4],[5,6,7,8],[-10,11,12,-13]],index = list('abc'),columns = ['one','two','three','four'])
    print frame.cummin()
    print frame
    >>>
       one  two  three  four
    a    1    2      3     4
    b    1    2      3     4
    c  -10    2      3   -13
       one  two  three  four
    a    1    2      3     4
    b    5    6      7     8
    c  -10   11     12   -13
    复制代码

    相关系数与协方差

    有些汇总统计(如相关系数和协方差)是通过参数对计算出来的。这一节数据得不到?上不去网。

    唯一值、值计数以及成员资格

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    
    obj = Series(['a','a','b','f','e'])
    uniques = obj.unique()
    uniques.sort() #记住这是就地排序
    #print uniques
    #下面进行计数统计,注意得到的是按照出现的频率降序排列
    #print obj.value_counts()
    #value_counts还是一个顶级的pandas方法。可用于任何是数组或者序列
    #print obj.values
    #print pd.value_counts(obj.values,sort = False)
    #最后是isin 判断矢量化集合的成员资格,可用于选取Series中或DataF列中的子集
    mask = obj.isin(['b','c'])
    print mask
    print obj[mask]
    
    data = DataFrame({'Qu1':[1,3,4,3,4],
                      'Qu2':[2,3,1,2,3],
                      'Qu3':[1,5,2,4,4]})
    print data
    print data.apply(pd.value_counts).fillna(0)
    复制代码

    image

    上面这几个函数是真的非常实用!

    4、处理缺失数据

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import time
    from numpy import nan as NA
    
    #pandas本来就被设计成自动忽略了缺失值、
    #nan None 都看做缺失值
    str_data = Series(['a',np.nan,'b','c'])
    str_data[0] = None
    print str_data.isnull()
    print str_data.notnull()
    >>>
    0     True
    1     True
    2    False
    3    False
    0    False
    1    False
    2     True
    3     True
    #NumPy的数据类型中缺少真正的NA数据类型或位模式??
     
    复制代码

    image

    滤除缺失数据

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import time
    from numpy import nan as NA
    
    data = Series([1,NA,3.5,7,NA])
    #注意返回的是不为NA的值的原来的索引,不是移除之后的索引
    #有一个函数 reset_index 这个函数(方法?)可以重新设置index,其中drop = True选项会丢弃原来的索引而设置新的从0开始的索引,这个方法只对DataFrame有用貌似。
    print data.dropna()
    #下面的结果一样
    print data[data.notnull()]
    data1 = DataFrame([[1,2,3],[NA,2.3,4],[NA,NA,NA]])
    #注意:由于DataFrame的设定,只要有NA的行就会舍弃
    print data1.dropna()
    #传入how = 'all' 则丢掉全为NA的行,这里的 how 的起名真的有点随心所欲了,哈哈
    print data1.dropna(how = 'all')
    #丢弃列
    print data1.dropna(how = 'all',axis = 1)
    #还有一个参数,thresh
    data2 = DataFrame(np.random.randn(7,3))
    data2.ix[:4,1] = NA
    data2.ix[:2,2] = NA
    #print data2
    #这里的thresh函数是选取最少non-NA值个数的行选出来
    print data2.dropna(thresh = 2)
    print data2.dropna(thresh = 4,axis = 1)
    复制代码

    填充缺失数据

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import time
    from numpy import nan as NA
    
    #主要用fillna方法填充NA处的值
    data2 = DataFrame(np.random.randn(7,3))
    data2.ix[:4,1] = NA
    data2.ix[:2,2] = NA
    #fillna返回一个新对象,inplace = True 可以就地填充
    print data2.fillna(0)
    #print data2.fillna(0,inplace = True)
    #print data2
    #为不同的列填充要用到字典
    print data2.fillna({1:0.5,3:-1})
    #对reindex有效的的那些差值方法也可适用于fillna,请向上看,或者搜索 reindex 即可
    df = DataFrame(np.random.randn(6,3))
    df.ix[2:,1] = NA
    df.ix[4:,2] = NA
    print df.fillna(method = 'ffill',limit = 2)
    #只要稍微动动脑子,我们就可以知道向NA处可以填充均值等其他数
    data = Series([1.2,NA,4,NA])
    print data.fillna(data.mean())
    复制代码

    fillna的参数如下:

    image

    image

    5、层次化索引

    层次化索引(hierarchical index)是pandas的重要功能,这能使在一个轴上拥有两个以上的索引级别。抽象点说,它能使你以低维度形式处理高维度。

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import time
    
    data = Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]])
    #print data
    #下面是索引的选取方式
    
    print data.index
    print data['b']
    print data['b':'c']
    print data.ix[['b','d']]
    #下面是“内层”的选取方式
    print data[:,2]
    #层次化索引在数据重塑和基于分组操作(如透视表生成)中扮演者重要的角色,比如用unstack方式重排DataFrame:
    print data.unstack()
    #stack是unstack的逆运算
    print data.unstack().stack()
    
    #对于DataFrame,每个轴都可以有分层索引
    frame = DataFrame(np.arange(12).reshape((4,3)),index = [['a','a','b','b'],[1,2,1,2]],columns = [['Ohio','Ohio','Colorado'],['Green','Red','Green']])
    #print frame
    #注意下面的方式:是为每一个轴规定名字,跟
    frame.index.names = ['key1','key2']
    frame.columns.names = ['state','color']
    #print frame
    #print frame['Ohio']
    
    #可以单独创建MultiIndex然后复用
    #下面的multiindex可以这样创建,注意下面的生成方式
    columns = pd.MultiIndex.from_arrays([['Ohio','Ohio','Colorado'],['Green','Red','Green']],names = ['state','color'])
    frame1 = DataFrame(np.arange(12).reshape((4,3)),columns = columns)
    print frame1
    #重排顺序,调整索引级别
    print frame.swaplevel('key1','key2')
    #sortlevel则根据但各级别中的值对数据进行排序,通常用swaplevel是也会用到sortlevel(很合理)
    #注意得到的是副本,不是就地修改
    print frame.sortlevel(1)
    print frame.swaplevel(0,1).sortlevel(0)
    print frame
    
    #许多对DataFrame和Series进行描述汇总的统计都有一个level选项,用于指定汇总方式
    print frame.sum(level = 'key2')
    #不指定level的话,会按照列汇总出所有列名的和
    print frame.sum()
    print frame.sum(level = 'color',axis = 1)
    复制代码
    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import time
    #人们经常想将DataFrame的一个或者多个列当作行索引来用,或者可能需要将行索引变成DataFrame的列
    frame = DataFrame({'a':range(7),'b':range(7,0,-1),'c':['one','one','one','two','two','two','two'],'d':[0,1,2,0,1,2,3]})
    print frame
    #DataFrame中的set_index函数会将其一个或者多个列转换为行索引
    frame2 = frame.set_index(['c','d'])
    print frame2  #其实就是利用第3、4列进行一次分类汇总
    frame3 = frame.set_index(['c','d'],drop = False)
    #与set_index相反的是reset_index函数
    print frame2.reset_index()
    #下面进行一次测试
    frame4 = DataFrame([[0,7],[1,6],[2,5],[3,4],[4,3],[5,2],[6,1]],index = [['one','one','one','two','two','two','two'],[0,1,2,0,1,2,3]],columns=['a','b'])
    frame4.index.names = ['c','d']
    print frame4
    print frame4.reset_index().sort_index(axis = 1)
    复制代码

    其他有关pandas的话题

    复制代码
    #-*- encoding:utf-8 -*-
    import numpy as np
    import os
    import pandas as pd
    from pandas import Series,DataFrame
    import matplotlib.pyplot as plt
    import pandas.io.data  as web
    #这里说的是一些蛋疼的问题:整数索引和整数标签
    ser = Series(np.arange(3.))
    #print ser[-1]  #报错,因为整数索引的歧义性
    ser2 = Series(np.arange(3.),index = ['a','b','c'])
    print ser2[-1] #正确
    #ix函数总是面向标签的
    print ser.ix[:1]
    #如果需要可靠的、不考虑索引类型的、基于位置的索引,可以使用Series的iget_value方法,Dataframe的irow 和 icol方法
    ser3 = Series(range(3),index= [-5,1,3])
    print ser3.iget_value(2)
    frame = DataFrame(np.arange(6).reshape(3,2),index = [2,0,1])
    print frame.irow(0)
    
    #pandas 有一个Panel数据结构(不是主要内容),可以看作是三维的DataFrame。pandas中的多维数据可以利用多层索引进行处理
    #可以利用DataFrame对象组成的字典或者一个三维ndarray来创建Panel对象
    pdata = pd.Panel(dict((stk,web.get_data_yahoo(stk,'1/1/2009','6/1/2012')) for stk in ['AAPL','GOOG','MSFT','DELL']))
    #网络错误,得不到数据
    #Panel的每一项都是一个DataFrame.
  • 相关阅读:
    elasticsearch 中的Multi Match Query
    activiti 流程部署的各种方式
    elasticsearch 嵌套对象之嵌套类型
    elasticsearch Java High Level REST 相关操作封装
    elasticsearch 字段数据类型
    ubuntu 安装 docker
    elasticsearch 通过HTTP RESTful API 操作数据
    facenet 人脸识别(二)——创建人脸库搭建人脸识别系统
    POJ 3093 Margaritas(Kind of wine) on the River Walk (背包方案统计)
    墨卡托投影, GPS 坐标转像素, GPS 坐标转距离
  • 原文地址:https://www.cnblogs.com/virusolf/p/6198412.html
Copyright © 2011-2022 走看看