美文网首页我爱编程
聚沙成塔--数据分析(二)(pandas的DataFrame结构

聚沙成塔--数据分析(二)(pandas的DataFrame结构

作者: 爱做饭的老谢 | 来源:发表于2018-01-07 00:18 被阅读76次

    版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置标明出处!!!

    DataFrame是一个表格类型的数据结构,想当于一个二维的数组,只不过DataFrame是按列来存储的,每一列可以有不同的数据类型,但每一列智能有一种数据类型,你可以把它想象成一个关系型数据库表,DataFrame也可是认为是由多个Series组成的,所有DataFrame取出的每一列都是一个Series数据结构。

    构建一个DataFrame数据结构可以有几种方法,可以是一位的字典类型的ndarrays、list、dicts、或Series等等。

    Series字典结构构建一个DataFrame结构

    import pandas as pd
    import numpy as np
    
    data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
            'B': pd.Series(np.random.randn(4), index=['a','b','c', 'd'])}
    
    df = pd.DataFrame(data)
    
    print(df)
    
    OUT:
              A         B
    a  0.965723  0.072575
    b -1.847803 -0.142484
    c -1.104322  1.540840
    d       NaN -0.843574
    

    从结果中可以看出key作为了列索引了,index作为行标签索引,没一列都是一个Series结构,NaN作为缺省值被填充在A列最后一个值已达到数据对齐的目的。如果我们为DataFrame指定了索引值,那么将安装索引值进行排序

    import pandas as pd
    import numpy as np
    
    data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
            'B': pd.Series(np.random.randn(4), index=['a','b','c', 'd'])}
    
    df = pd.DataFrame(data, index=['b', 'c', 'a'])
    
    print(df)
    
    OUT:
              A         B
    b  0.403256  2.753227
    c -0.220886  1.728152
    a  0.909863  0.240732
    

    如果给出的索引在data数据列索引中没有将会以缺省值填充。DataFrame既然是二维的数据结构那么它也能指定列索引。

    import pandas as pd
    import numpy as np
    
    data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
            'B': pd.Series(np.random.randn(4), index=['a','b','c', 'd'])}
    
    df = pd.DataFrame(data, index=['b', 'c', 'a'], columns=['A', 'C'])
    
    print(df)
    OUT:
              A    C
    b -0.914111  NaN
    c -0.086271  NaN
    a  0.256684  NaN
    

    当然行列都被以索引的属性提供给了DataFrame数据类型,你可以通过df.index取到行标签索引,通过df.columns取到列标签索引。

    ndarrays&lists构建DataFrame

    import pandas as pd
    import numpy as np
    
    data = {'A': [1,2,3,4],
            'B': [5,6,7,8]}
    
    df = pd.DataFrame(data)
    
    print(df)
    
    OUT:
       A  B
    0  1  5
    1  2  6
    2  3  7
    3  4  8
    

    从列表字典类型构建DataFrame

    import pandas as pd
    import numpy as np
    
    data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
    
    df = pd.DataFrame(data)
    
    print(df)
    
    OUT:
       a   b     c
    0  1   2   NaN
    1  5  10  20.0
    

    当然你可以像上面那样去指定它的index、columns。

    从元组字典类型构建DataFrame

    import pandas as pd
    import numpy as np
    
    data = {('a', 'b'):{('A', 'B'):1, ('A', 'C'): 2},
            ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4}}
    
    df = pd.DataFrame(data)
    
    print(df)
    
    OUT:
         a   
         a  b
    A B  4  1
      C  3  2
    

    从元组字典类型构建的DataFrame数据类型是一个多索引的数据结构类型,不过思想都是一样的key作为列索引,值里面的key作为行索引。关于多个索引将会在后面介绍。

    列的选取、增加、删除、筛选

    • 选取一列
    import pandas as pd
    import numpy as np
    
    data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
            'B': pd.Series(np.random.randn(3), index=['a','b','c'])}
    
    df = pd.DataFrame(data)
    
    print(df['A'])
    
    OUT:
    a    0.518881
    b    0.928695
    c   -0.843319
    Name: A, dtype: float64
    

    当然你也可以选取多列,多列的选取可以像下面这么做

    import pandas as pd
    import numpy as np
    
    data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
            'B': pd.Series(np.random.randn(3), index=['a','b','c']),
            'C': pd.Series(np.random.randn(3), index=['a','b','c'])}
    
    
    df = pd.DataFrame(data)
    
    print(df[['A', 'C']])
    OUT:
              A         C
    a  0.940624  0.035024
    b  0.318521  0.222687
    c  0.180449  0.433753
    

    你还可以使用iloc按行位置选取、loc按行标签索引选取

    import pandas as pd
    import numpy as np
    
    data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
            'B': pd.Series(np.random.randn(3), index=['a','b','c']),
            'C': pd.Series(np.random.randn(3), index=['a','b','c'])}
    
    
    df = pd.DataFrame(data)
    
    print(df)
    
    # 按行位置索引
    print('取行索引为1的一行数据:\n%s' % df.iloc[1])
    print('取行索引为1,2的两行数据:\n%s' % df.iloc[1:])
    
    # 按行标签索引
    print('取行标签索引为b的一行数据:\n%s' % df.loc['b'])
    print('取行标签索引为a到c的三行数据:\n%s' % df.loc['a': 'c'])
    OUT:
              A         B         C
    a  0.284014  1.053296  0.529340
    b -1.443032  1.114718  0.449405
    c -0.087776  1.718656 -0.490695
    取行索引为1的一行数据:
    A   -1.443032
    B    1.114718
    C    0.449405
    Name: b, dtype: float64
    取行索引为1,2的两行数据:
              A         B         C
    b -1.443032  1.114718  0.449405
    c -0.087776  1.718656 -0.490695
    取行标签索引为b的一行数据:
    A   -1.443032
    B    1.114718
    C    0.449405
    Name: b, dtype: float64
    取行标签索引为a到c的三行数据:
              A         B         C
    a  0.284014  1.053296  0.529340
    b -1.443032  1.114718  0.449405
    c -0.087776  1.718656 -0.490695
    
    • 增加一列
    import pandas as pd
    import numpy as np
    
    data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
            'B': pd.Series(np.random.randn(3), index=['a','b','c'])}
    
    
    df = pd.DataFrame(data)
    
    df['C'] = df['A'] * df['B']
    
    print(df)
    
    OUT:
              A         B         C
    a  1.785824  0.823041  1.469807
    b  0.252471 -0.756140 -0.190903
    c  0.111340  1.352880  0.150629
    
    • 删除一列
    import pandas as pd
    import numpy as np
    
    data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
            'B': pd.Series(np.random.randn(3), index=['a','b','c'])}
    
    
    df = pd.DataFrame(data)
    
    df['C'] = df['A'] * df['B']
    
    del df['A']
    
    print(df)
    
    OUT:
              B         C
    a  0.172547 -0.128743
    b -0.305665 -0.393696
    c  2.006161 -2.865414
    
    • 筛选A列大于0的数据
    import pandas as pd
    import numpy as np
    
    data = {'A': pd.Series(np.random.randn(3), index=['a','b','c']),
            'B': pd.Series(np.random.randn(3), index=['a','b','c'])}
    
    
    df = pd.DataFrame(data)
    
    df['C'] = df['A'] * df['B']
    print(df)
    print(df[df.A > 0])
    
    OUT:
              A         B         C
    a -1.166174 -0.651518  0.759784
    b  0.889244 -0.199157 -0.177100
    c -0.795640 -0.018516  0.014732
              A         B       C
    b  0.889244 -0.199157 -0.1771
    

    时间序列

    import pandas as pd
    import numpy as np
    
    index = pd.date_range('01/01/2018', periods=8)
    
    
    df = pd.DataFrame(np.random.randn(8, 3), index=index, columns=list('ABC'))
    
    print(df)
    OUT:
                       A         B         C
    2018-01-01 -0.001183  0.749614  0.470705
    2018-01-02 -0.900087 -3.067426 -1.840941
    2018-01-03 -0.938453 -0.053678 -1.187395
    2018-01-04  1.149277  0.266508  0.730095
    2018-01-05  0.680196 -1.148432  1.066883
    2018-01-06 -0.475393  0.493522 -1.730322
    2018-01-07  0.554609 -1.553775  0.425781
    2018-01-08  1.978791 -0.503719 -0.343008
    

    okay, DataFrame的介绍就到这里,希望你能跟我一起去学习,去进步


    欢迎关注我:「爱做饭的老谢」,老谢一直在努力...

    相关文章

      网友评论

        本文标题:聚沙成塔--数据分析(二)(pandas的DataFrame结构

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