zoukankan      html  css  js  c++  java
  • pd.DataFrame()函数解析(最清晰的解释)

    欢迎关注WX公众号:【程序员管小亮】

    DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。

    0 简介

    DataFrame的单元格可以存放数值、字符串等,这和excel表很像,同时DataFrame可以设置列名columns与行名index。

    1 创建DataFrame

    以下的实验是在python3.5.6版本下进行的。

    pandas常与numpy一起配合使用,所以通常会一起引用,也就是:

    import pandas as pd
    import numpy as np
    
    1.1 使用numpy函数创建

    可以直接通过pandas的DataFrame函数进行创建。

    import pandas as pd
    import numpy as np
    
    df1 = pd.DataFrame(np.random.randn(3, 3), index=list('abc'), columns=list('ABC'))
    print(df1)
    
    #           A         B         C
    # a -0.612978  0.237191  0.312969
    # b -1.281485  1.135944  0.162456
    # c  2.232905  0.200209  0.028671
    

    其中第一个参数是存放在DataFrame里的数据,第二个参数index就是之前说的行名,第三个参数columns是之前说的列名。

    其中后两个参数可以使用list输入,但是注意,这个list的长度要和DataFrame的大小匹配,不然会报错。

    df2 = pd.DataFrame(np.random.randn(3, 3), index=list('abcd'), columns=list('ABCD'))
    # ValueError: Shape of passed values is (3, 3), indices imply (4, 4)
    

    当然,这两个参数是可选的,你可以选择不设置,而且这两个list是可以一样的。

    df3 = pd.DataFrame(np.random.randn(3, 3), index=list('ABC'), columns=list('ABC'))
    
    #           A         B         C
    # A  1.106838  0.309086  0.748472
    # B  0.439228 -0.213154 -1.438647
    # C  0.292450  0.841237 -0.069207
    
    1.2 直接创建
    import pandas as pd
    import numpy as np
    
    df4 = pd.DataFrame([[1, 2, 3], 
    					[2, 3, 4],
                        [3, 4, 5]],
                       index=list('abc'), columns=list('ABC'))
    print(df4)
    
    #    A  B  C
    # a  1  2  3
    # b  2  3  4
    # c  3  4  5
    
    1.3 使用字典创建
    import pandas as pd
    import numpy as np
    
    dic1 = {
        'name': [
            '张三', '李四', '王二麻子', '小淘气'], 'age': [
                37, 30, 50, 16], 'gender': [
                    '男', '男', '男', '女']}
    df5 = pd.DataFrame(dic1)
    print(df5)
    
    #    age gender  name
    # 0   37      男    张三
    # 1   30      男    李四
    # 2   50      男  王二麻子
    # 3   16      女   小淘气
    

    2 DataFrame属性

    2.1 查看列的数据类型
    print(df5.dtypes)
    
    # age        int64
    # gender    object
    # name      object
    # dtype: object
    
    2.2 查看DataFrame的头尾

    使用head可以查看前几行的数据,默认的是前5行,不过也可以自己设置。

    使用tail可以查看后几行的数据,默认也是5行,参数可以自己设置。

    比如看前5行。

    import pandas as pd
    import numpy as np
    
    df6 = pd.DataFrame(np.arange(36).reshape(6, 6), index=list('abcdef'), columns=list('ABCDEF'))
    print(df6)
    #     A   B   C   D   E   F
    # a   0   1   2   3   4   5
    # b   6   7   8   9  10  11
    # c  12  13  14  15  16  17
    # d  18  19  20  21  22  23
    # e  24  25  26  27  28  29
    # f  30  31  32  33  34  35
    
    print(df6.head())
    #     A   B   C   D   E   F
    # a   0   1   2   3   4   5
    # b   6   7   8   9  10  11
    # c  12  13  14  15  16  17
    # d  18  19  20  21  22  23
    # e  24  25  26  27  28  29
    

    比如只看前2行。

    print(df6.head(2))
    
    #    A  B  C  D   E   F
    # a  0  1  2  3   4   5
    # b  6  7  8  9  10  11
    

    比如看后5行。

    print(df6.tail())
    
    #     A   B   C   D   E   F
    # b   6   7   8   9  10  11
    # c  12  13  14  15  16  17
    # d  18  19  20  21  22  23
    # e  24  25  26  27  28  29
    # f  30  31  32  33  34  35
    

    比如只看后2行。

    print(df6.tail(2))
    
    #     A   B   C   D   E   F
    # e  24  25  26  27  28  29
    # f  30  31  32  33  34  35
    
    2.3 查看行名与列名

    使用index查看行名,columns查看列名。

    print(df6.index)
    print(df6.columns)
    
    # Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
    # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
    
    2.4 查看数据值

    使用values可以查看DataFrame里的数据值,返回的是一个数组。

    print(df6.values)
    
    # [[ 0  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]]
    

    比如说查看某一列所有的数据值。

    print(df6['B'].values)
    
    [ 1  7 13 19 25 31]
    

    如果查看某一行所有的数据值。使用iloc查看数据值(但是好像只能根据行来查看?),iloc是根据数字索引(也就是行号)。可以看一下博客pandas.iloc()函数解析

    print(df6.iloc[0])
    
    # A    0
    # B    1
    # C    2
    # D    3
    # E    4
    # F    5
    # Name: a, dtype: int32
    
    2.5 查看行列数

    使用shape查看行列数,参数为0表示查看行数,参数为1表示查看列数。

    print(df6.shape[0])
    print(df6.shape[1])
    
    # 6
    # 6
    
    2.6 切片

    使用冒号进行切片。

    print(df6['a':'b'])
    
    #    A  B  C  D   E   F
    # a  0  1  2  3   4   5
    # b  6  7  8  9  10  11
    
    2.7 索引
    print(df6.loc[:,'A':'B'])
    
    #     A   B
    # a   0   1
    # b   6   7
    # c  12  13
    # d  18  19
    # e  24  25
    # f  30  31
    
    • 切片表示的是行切片
    • 索引表示的是列索引

    3 DataFrame操作

    3.1 转置

    直接字母T,线性代数上线。

    print(df6.T)
    
    #    a   b   c   d   e   f
    # A  0   6  12  18  24  30
    # B  1   7  13  19  25  31
    # C  2   8  14  20  26  32
    # D  3   9  15  21  27  33
    # E  4  10  16  22  28  34
    # F  5  11  17  23  29  35
    
    3.2 描述性统计

    使用describe可以对数据根据进行描述性统计。

    print(df6.describe())
    
    #                A          B          C          D          E          F
    # count   6.000000   6.000000   6.000000   6.000000   6.000000   6.000000
    # mean   15.000000  16.000000  17.000000  18.000000  19.000000  20.000000
    # std    11.224972  11.224972  11.224972  11.224972  11.224972  11.224972
    # min     0.000000   1.000000   2.000000   3.000000   4.000000   5.000000
    # 25%     7.500000   8.500000   9.500000  10.500000  11.500000  12.500000
    # 50%    15.000000  16.000000  17.000000  18.000000  19.000000  20.000000
    # 75%    22.500000  23.500000  24.500000  25.500000  26.500000  27.500000
    # max    30.000000  31.000000  32.000000  33.000000  34.000000  35.000000
    

    如果有的列是非数值型的,那么就不会进行统计。

    如果想对行进行描述性统计,转置后再进行describe。

    3.3 计算

    使用sum默认对每列求和,sum(1)为对每行求和。

    print(df6.sum())
    # A     90
    # B     96
    # C    102
    # D    108
    # E    114
    # F    120
    # dtype: int64
    
    print(df6.sum(1))
    # a     15
    # b     51
    # c     87
    # d    123
    # e    159
    # f    195
    # dtype: int64
    

    数乘运算使用apply。

    print(df6.apply(lambda x: x * 2))
    
    #     A   B   C   D   E   F
    # a   0   2   4   6   8  10
    # b  12  14  16  18  20  22
    # c  24  26  28  30  32  34
    # d  36  38  40  42  44  46
    # e  48  50  52  54  56  58
    # f  60  62  64  66  68  70
    

    乘方运算跟matlab类似,直接使用两个*。

    print(df6**2)
    
    #      A    B     C     D     E     F
    # a    0    1     4     9    16    25
    # b   36   49    64    81   100   121
    # c  144  169   196   225   256   289
    # d  324  361   400   441   484   529
    # e  576  625   676   729   784   841
    # f  900  961  1024  1089  1156  1225
    
    3.4 新增

    扩充列可以直接像字典一样,列名对应一个list,但是注意list的长度要跟index的长度一致。

    df6['G']=['999','999','999','999','999','999']
    print(df6)
    
    #     A   B   C   D   E   F    G
    # a   0   1   2   3   4   5  999
    # b   6   7   8   9  10  11  999
    # c  12  13  14  15  16  17  999
    # d  18  19  20  21  22  23  999
    # e  24  25  26  27  28  29  999
    # f  30  31  32  33  34  35  999
    

    还可以使用insert,使用这个方法可以指定把列插入到第几列,其他的列顺延。

    df6.insert(0, 'QQ', ['999','999','999','999','999','999'])
    print(df6)
    
    #     QQ   A   B   C   D   E   F
    # a  999   0   1   2   3   4   5
    # b  999   6   7   8   9  10  11
    # c  999  12  13  14  15  16  17
    # d  999  18  19  20  21  22  23
    # e  999  24  25  26  27  28  29
    # f  999  30  31  32  33  34  35
    
    3.5 合并

    使用join可以将两个DataFrame合并,但只根据行列名合并,并且以作用的那个DataFrame的为基准。

    # 也就是以df6为基准。
    df7 = pd.DataFrame(['my', 'name', 'is', 'a', 'b', 'c'], index=list('abcdef'), columns=list('G'))
    df8 = df6.join(df7)
    print(df8)
    
    #     A   B   C   D   E   F     G
    # a   0   1   2   3   4   5    my
    # b   6   7   8   9  10  11  name
    # c  12  13  14  15  16  17    is
    # d  18  19  20  21  22  23     a
    # e  24  25  26  27  28  29     b
    # f  30  31  32  33  34  35     c
    

    但是,join这个方法还有how这个参数可以设置,合并两个DataFrame的交集或并集。参数为’inner’表示交集,'outer’表示并集。

    df7 = pd.DataFrame(['2', '6', '7', '19', '44', '77'], index=list('abekld'), columns=list('G'))
    
    df8=df6.join(df7,how='inner')
    df9=df6.join(df7,how='outer')
    print(df8)
    #     A   B   C   D   E   F   G
    # a   0   1   2   3   4   5   2
    # b   6   7   8   9  10  11   6
    # d  18  19  20  21  22  23  77
    # e  24  25  26  27  28  29   7
    
    print(df9)
    #       A     B     C     D     E     F    G
    # a   0.0   1.0   2.0   3.0   4.0   5.0    2
    # b   6.0   7.0   8.0   9.0  10.0  11.0    6
    # c  12.0  13.0  14.0  15.0  16.0  17.0  NaN
    # d  18.0  19.0  20.0  21.0  22.0  23.0   77
    # e  24.0  25.0  26.0  27.0  28.0  29.0    7
    # f  30.0  31.0  32.0  33.0  34.0  35.0  NaN
    # k   NaN   NaN   NaN   NaN   NaN   NaN   19
    # l   NaN   NaN   NaN   NaN   NaN   NaN   44
    

    如果要合并多个Dataframe,可以用list把几个Dataframe装起来,然后使用concat转化为一个新的Dataframe。

    df10 = pd.DataFrame([1, 2, 3, 4, 5, 6], 
    					index=list('ABCDEF'), columns=['a'])
    df11 = pd.DataFrame([10, 20, 30, 40, 50, 60],
                        index=list('ABCDEF'), columns=['b'])
    df12 = pd.DataFrame([100, 200, 300, 400, 500, 600],
                        index=list('ABCDEF'), columns=['c'])
    list1 = [df10.T, df11.T, df12.T]
    df13 = pd.concat(list1)
    print(df13)
    
    #      A    B    C    D    E    F
    # a    1    2    3    4    5    6
    # b   10   20   30   40   50   60
    # c  100  200  300  400  500  600
    
    3.6 去重
    df.drop_duplicates(subset=None,
                       keep='first',
                       inplace=False
                       )
    

    参数:

    • subset:指定是哪些列重复。
    • keep:去重后留下第几行,{‘first’, ‘last’, False}, default ‘first’},如果是False,则去除全部重复的行。
    • inplace:是否作用于原来的df。
    df14 = pd.DataFrame(data=[[1, 2, 3],
                              [1, 2, 4],
                              [1, 2, 4],
                              [1, 2, 3],
                              [1, 2, 5],
                              [1, 2, 5]],
                        index=list('ABCDEF'),
                        columns=['a', 'b', 'c'])
    print(df14)
    
    #    a  b  c
    # A  1  2  3
    # B  1  2  4
    # C  1  2  4
    # D  1  2  3
    # E  1  2  5
    # F  1  2  5
    

    去除重复行,保留重复行中最后一行

    df14.drop_duplicates(keep='last')
    
    #    a  b  c
    # C  1  2  4
    # D  1  2  3
    # F  1  2  5
    

    去除’c’列中有重复的值所在的行

    print(df14.drop_duplicates(subset=('c',)))
    
    #    a  b  c
    # A  1  2  3
    # B  1  2  4
    # E  1  2  5
    

    如果想要更多的资源,欢迎关注 @我是管小亮,文字强迫症MAX~

    回复【福利】即可获取我为你准备的大礼,包括C++,编程四大件,NLP,深度学习等等的资料。

    想看更多文(段)章(子),欢迎关注微信公众号「程序员管小亮」~

    在这里插入图片描述

    参考文章

  • 相关阅读:
    前端的一些雕虫小技,从100%和滚动条说起
    这事没完,继续聊spring cloud stream和kafka的这些小事
    简单聊一聊spring cloud stream和kafka的那点事
    是谁,在敲打我窗-CSS雨滴动画效果
    对照谈-官方spring-boot-starter和自定义starter异同分析
    从spring boot发邮件聊到开发的友好性
    抖音抖一抖-SVG和CSS视觉故障艺术小赏
    上位机组态控件PCHMI-PLC地址命名规则
    【C#格式化字符】【C#Chart图表控件】【饼图、柱形图、波形图】
    【PCHMI.DLL】【C#上位机二次开发文档】2021年7月15更新
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302754.html
Copyright © 2011-2022 走看看