• 您当前位置:网站首页 >> Python学习 >> Python 数据分析模块 Pandas 之 DataFrame 数据
  • Python 数据分析模块 Pandas 之 DataFrame 数据

    iCoA首席特工 逍遥峡谷 发布:2020-02-09 更新:2020-02-09 浏览0条评论
    内容简介

    相关关键词:Python   Pandas   DataFrame   数据分析  

    本文链接:https://www.icoa.cn/a/901.html

    本站文章如非注明皆为原创,未经允许禁止转载。如有问题可以给我留言或发邮件。

    前面学习了 Python 第三方数据分析模块 Pandas 里一维数据 Series 的基础知识,本文我们学习 Pandas 里的 DataFrame 多维数据。

    更多点击:Python学习日志目录

    创建 DataFrame 数据

    我们可以使用字典来创建 DataFrame 数据。

    当然文档开头要导入 Pandas 数据,下面举例的时候,不再重复了:

    import pandas as pd
    dict_data = {
        'Name':['Anna','Nina','Elena','Tom'],
        'Age':[12,11,3,8],
        'Gender':['Girl','Girl','Girl','Boy']}
    data = pd.DataFrame(dict_data)
    print(data)

    运行结果:

         Name  Age Gender
    0   Anna   12   Girl
    1   Nina   11   Girl
    2  Elena    3   Girl
    3    Tom    8    Boy

    也就是'Name' 'Age' 'Gender'这些是行,后面的是列。


    我们还可以自定义列的顺序:

    data = pd.DataFrame(dict_data, columns=['Gender','Name','Age'])
    print(data)

    运行结果:

        Gender   Name  Age
    0   Girl   Anna   12
    1   Girl   Nina   11
    2   Girl  Elena    3
    3    Boy    Tom    8


    获得 DataFrame 数据中列的名称

    print(data.colums)

    运行结果:

    Index(['Gender', 'Name', 'Age'], dtype='object')


    获取 DataFrame 数据中某一列的数据

    下面两种方法都可以:

    print(data['Name'])
    print(data.Age)

    运行结果:

    0     Anna
    1     Nina
    2    Elena
    3      Tom
    Name: Name, dtype: object
    0    12
    1    11
    2     3
    3     8
    Name: Age, dtype: int64


    获取 DataFrame 数据中某一行的数据

    根据行号索引:

    print(data.iloc[0])

    运行结果:

    Gender    Girl
    Name      Anna
    Age         12
    Name: 0, dtype: object


    如果有特殊索引值的话,可以根据行索引值:

    data.index = ['a','b','c','d']
    print(data.loc['b'])

    运行结果:

    Gender    Girl
    Name      Nina
    Age         11
    Name: b, dtype: object


    切片跟 Series 非常像,同样对切片的数据进行修改的话,会修改原数据值:

    slice_data = data['Age']
    slice_data[0] = 9
    print(data)

    运行结果:

        Gender   Name  Age
    a   Girl   Anna    9
    b   Girl   Nina   11
    c   Girl  Elena    3
    d    Boy    Tom    8


    所以如果想要切片数据作为一个独立的数据,不关联源数据,则在赋值的时候加一个.copy()函数即可:

    slice_data = data['Age'].copy()
    slice_data[0] = 9
    print(slice_data)
    print(data)

    运行结果:

    a     9
    b    11
    c     3
    d     8
    Name: Age, dtype: int64
      Gender   Name  Age
    a   Girl   Anna   12
    b   Girl   Nina   11
    c   Girl  Elena    3
    d    Boy    Tom    8


    将 DataFrame 数据中的某一列修改为相同的数据:

    data['Age'] = 8
    print(data)

    运行结果:

        Gender   Name  Age
    a   Girl   Anna    8
    b   Girl   Nina    8
    c   Girl  Elena    8
    d    Boy    Tom    8


    也可以批量填充 DataFrame 某一列的数据:

    data['Age'] = range(5,9)
    print(data)

    运行结果:

        Gender   Name  Age
    a   Girl   Anna    5
    b   Girl   Nina    6
    c   Girl  Elena    7
    d    Boy    Tom    8


    可以使用 Series 数据修改 DataFrame 数据中的某一列

    age = pd.Series([8,7,6,9])
    data['Age'] = age
    print(data)

    运行结果:

        Gender   Name  Age
    0   Girl   Anna    8
    1   Girl   Nina    7
    2   Girl  Elena    6
    3    Boy    Tom    9


    如果 DataFrame 数据有特殊索引值,那么使用 Series 数据修改的时候,特殊索引值可以一一对应。

    dict_data = {
        'Name':['Anna','Nina','Elena','Tom'],
        'Age':[12,11,3,8],
        'Gender':['Girl','Girl','Girl','Boy']}
    data = pd.DataFrame(dict_data, index=['a','b','c','d'])
    age = pd.Series([18,17,15,9], index=['d','a','c','b'])
    data['Age'] = age
    print(age)
    print(data)

    运行结果:

    d    18
    a    17
    c    15
    b     9
    dtype: int64
        Name  Age Gender
    a   Anna   17   Girl
    b   Nina    9   Girl
    c  Elena   15   Girl
    d    Tom   18    Boy


    删除 DataFrame 中的一列数据

    del data['Gender']
    print(data)

    运行结果:

         Name  Age
    a   Anna   12
    b   Nina   11
    c  Elena    3
    d    Tom    8


    修改索引排序:

    data = data.reindex(['c','b','d','a'])
    print(data)

    运行结果:

         Name  Age Gender
    c  Elena    3   Girl
    b   Nina   11   Girl
    d    Tom    8    Boy
    a   Anna   12   Girl


    如果修改索引的时候,索引数比原数据索引数多一行,则多的这行会被赋值 NaN

    data = data.reindex(['c','b','d','a','x'])
    print(data)

    运行结果:

         Name   Age Gender
    c  Elena   3.0   Girl
    b   Nina  11.0   Girl
    d    Tom   8.0    Boy
    a   Anna  12.0   Girl


    如果修改索引的时候,想给增加的索引行赋值某个数,可以用给 fill_value 赋值的方法:

    data = data.reindex(['c','b','d','a','x'], fill_value=0)
    print(data)

    运行结果:

         Name  Age Gender
    c  Elena    3   Girl
    b   Nina   11   Girl
    d    Tom    8    Boy
    a   Anna   12   Girl
    x      0    0      0


    还可以使用插值法给空行赋值

    method = 'ffill' / method = 'pad' 是从最后一行赋值一组数据

    # method = 'bfill' / method = 'backfill' 这个应该是从前面赋值一组数据,但是没有运行成功不知道为什么

    data = pd.DataFrame(dict_data, index=['a','b','c','d'])
    print(data)
    data = data.reindex(['c','x','b','d','a'], method='ffill')
    print(data)

    运行结果:

         Name  Age Gender
    a   Anna   12   Girl
    b   Nina   11   Girl
    c  Elena    3   Girl
    d    Tom    8    Boy
        Name  Age Gender
    c  Elena    3   Girl
    x    Tom    8    Boy
    b   Nina   11   Girl
    d    Tom    8    Boy
    a   Anna   12   Girl


    扔掉包含缺失数据(为NaN)的行,即数据不全的行

    print(data.dropna)

    扔掉全部数据缺失的行

    print(data.dropna(how='all'))

    把数据缺失的行补充为指定数值

    print(data.fillna(0))

    运行结果:

        Name   Age Gender
    c  Elena   9.0   Girl
    x      0   0.0      0
    b   Nina  11.0   Girl
    d    Tom   8.0    Boy
    a   Anna  12.0   Girl

    也可以指定列填充不同的默认值

    print(data.fillna({'Gender':'Girl','Age':8,'Name':'Unknow'}))

    运行结果:

          Name   Age Gender
    c   Elena   9.0   Girl
    x  Unknow   8.0   Girl
    b    Nina  11.0   Girl
    d     Tom   8.0    Boy
    a    Anna  12.0   Girl


    删除某一行

    data = data.drop('d')


    筛选数据:

    print(data[data['Age'] > 9])
    print(data[data['Gender'] == 'Girl'])
    name_list = ['Nina','Anna','Elena']
    print(data[data['Name'].isin(name_list)])

    运行结果:

        Name   Age Gender
    b  Nina  11.0   Girl
    a  Anna  12.0   Girl
        Name   Age Gender
    c  Elena   9.0   Girl
    b   Nina  11.0   Girl
    a   Anna  12.0   Girl
        Name   Age Gender
    c  Elena   9.0   Girl
    b   Nina  11.0   Girl
    a   Anna  12.0   Girl


    可以使用 groupby 对数据进行分组,之后可以使用.sum()/.mean()等函数进行计算

    data = pd.DataFrame({
        'id':['a','c','b','c','a'],
        'num':[1,2,3,4,5]
    })
    group_data = data.groupby('id')
    sum_data = group_data.sum()
    print(sum_data)

    运行结果:

            num
    id
    a     6
    b     3
    c     6


    数据按照索引名称进行排序

    print(data.sort_index()) #升序
    print(data.sort_index(ascending=False)) #倒序

    运行结果:

         Name   Age Gender
    a   Anna  12.0   Girl
    b   Nina  11.0   Girl
    c  Elena   9.0   Girl
    d    Tom   8.0    Boy
    x    NaN   NaN    NaN
        Name   Age Gender
    x    NaN   NaN    NaN
    d    Tom   8.0    Boy
    c  Elena   9.0   Girl
    b   Nina  11.0   Girl
    a   Anna  12.0   Girl


    也可以按照某一列数据进行排序

    print(data.sort_values(by='Age'))
    print(data.sort_values(by='Age',ascending=False))

    运行结果:

          Name   Age Gender
    d    Tom   8.0    Boy
    c  Elena   9.0   Girl
    b   Nina  11.0   Girl
    a   Anna  12.0   Girl
    x    NaN   NaN    NaN
        Name   Age Gender
    a   Anna  12.0   Girl
    b   Nina  11.0   Girl
    c  Elena   9.0   Girl
    d    Tom   8.0    Boy
    x    NaN   NaN    NaN


    数据汇总:

    数值则会相加,而字符串会连接在一起

    print(data)
    print(data.sum())

    运行结果:

         Name  Age Gender
    a   Anna   12   Girl
    b   Nina   11   Girl
    c  Elena    9   Girl
    d    Tom    8    Boy
    Name      AnnaNinaElenaTom
    Age                     40
    Gender     GirlGirlGirlBoy
    dtype: object

    注意,如果数据中有 NaN,那么字符串连接就不会发生,数值列会相加

         Name   Age Gender
    c  Elena   9.0   Girl
    x    NaN   NaN    NaN
    b   Nina  11.0   Girl
    d    Tom   8.0    Boy
    a   Anna  12.0   Girl
    ---------------
    Age    40.0
    dtype: float64

    数据统计相关函数:

    函数说明
     
    count
    统计非NaN数据的数量
    min/max
    统计最小值和最大值
    argmin/argmax
    查找最小值和最大值的位置
    sum
    计算数据的和
    mean
    计算平均数
    median
    计算中位数
    var
    计算方差
    std
    计算标准差


    可以使用多种方式对 DataFrame 进行索引

    data = pd.DataFrame(dict_data, index=[['a','a','b','b'],[1,2,3,2]])
    print(data)

    运行结果:

           Name  Age Gender
    a 1   Anna   12   Girl
      2   Nina   11   Girl
    b 3  Elena    9   Girl
      2    Tom    8    Boy

    会对其中特殊索引值进行合并。


    对两个 DataFrame 数据进行连接:

    dict_data = {
        'Name':['Anna','Nina','Elena','Tom'],
        'Age':[12,11,9,8],
        'Gender':['Girl','Girl','Girl','Boy']}
    class_data = {
        'Name':['Anna','Nina','Elena','Tom'],
        'Class':[1,3,2,4]
    }
    data1 = pd.DataFrame(dict_data)
    data2 = pd.DataFrame(class_data)
    data = pd.merge(data1,data2)
    print(data)

    运行结果:

         Name  Age Gender  Class
    0   Anna   12   Girl      1
    1   Nina   11   Girl      3
    2  Elena    9   Girl      2
    3    Tom    8    Boy      4


    在对两个 DataFrame 数据连接的时候,如果数据行数不同,则只会留下重合的部分

    dict_data = {
        'Name':['Anna','Nina','Elena','Tom'],
        'Age':[12,11,9,8],
        'Gender':['Girl','Girl','Girl','Boy']}
    class_data = {
        'Name':['Anna','Nina','Elena','Elsa'],
        'Class':[1,3,2,4]
    }
    data1 = pd.DataFrame(dict_data)
    data2 = pd.DataFrame(class_data)
    data = pd.merge(data1,data2)
    print(data)

    运行结果:

         Name  Age Gender  Class
    0   Anna   12   Girl      1
    1   Nina   11   Girl      3
    2  Elena    9   Girl      2


    如果想要两个 DataFrame 数据连接的时候,不丢弃掉非重合的部分,则需要添加一个参数 how:

    data = pd.merge(data1,data2,how='outer')

    输出结果:

         Name   Age Gender  Class
    0   Anna  12.0   Girl    1.0
    1   Nina  11.0   Girl    3.0
    2  Elena   9.0   Girl    2.0
    3    Tom   8.0    Boy    NaN
    4   Elsa   NaN    NaN    4.0

    也可以只保留一个数据的参数,那么 how 的值为 left 或者 right,以左边为准,还是以右边为准:

    data = pd.merge(data1,data2,how='left')

    输出结果:

         Name  Age Gender  Class
    0   Anna   12   Girl    1.0
    1   Nina   11   Girl    3.0
    2  Elena    9   Girl    2.0
    3    Tom    8    Boy    NaN


    两个 DataFrame 数据连接的时候,想要以某一列的数据对齐进行连接,增加一个on参数就可以:

    data = pd.merge(data1,data2,on='Name')

    如果两个 DataFrame 数据中没有同名称的列,连接的时候,可以分别指定左右两个数据的某一列进行对齐

    data = pd.merge(data1,data2,left_on='Name',right_on='Student')


    Pandas 读写文件


    读取 CSV 文件:

    data = pd.read_csv('simple.csv')

    读取的时候,会默认把第一行当做标题行。

    如果读取的时候,源文件里没有标题行,则需要添加参数 header=None

    data = pd.read_csv('simple.csv',header=None)

    这时候,标题行则为0,1,2,3等数值。

    也可以使用names参数自定义标题行:

    data = pd.read_csv('simple.csv',names=['Name','Age','Class'])

    如果想把第一列当做索引列,则需要增加参数index_col,指定某一列为索引列

    data = pd.read_csv('simple.csv',names=['ID','Name','Age','Class'],index_col='ID')

    另外读取的时候,可以使用sep参数指定源文件的分隔符:

    data = pd.read_csv('simple.csv',sep=',')


    存储为 CSV 文件:

    data.to_csv('simple.csv')

    把 data 的数据存入csv文件。


    读取 Excel 文件:

    需要安装一个第三方模块 xlrd

    pip install xlrd -i https://pypi.douban.com/simple

    读取 Excel 文件

    file = pd.ExcelFile('simple.xlsx')
    data = file.parse('Sheet1')

    其中 Sheet1 为 Excel 中想要读取的工作表的名称。


    Pandas VS Numpy

    读取文件的时候,Pandas 速度远远快于 Numpy,而且功能更强大。但是在数据运算方面 Numpy 更快一些。


    本文链接:https://www.icoa.cn/a/901.html
    关键词: Python   Pandas   DataFrame   数据分析  


    如果您愿意支持本站,欢迎点击打赏哦~



    下一篇:Python 详细安装步骤图解

    上一篇:Python 数据分析模块 Pandas 之 Series 数据


    - 相关文章 -


    Python 数字与数字型运算 - 2020-09-08

    Python 基础知识之数据类型 - 2020-09-07

    Python 学习中非常好用的编辑器 Sublime Text 3 - 2020-09-07

    Python 基础知识之变量 - 2020-09-03

    Python 详细安装步骤图解 - 2020-09-01

    Python 数据分析模块 Pandas 之 DataFrame 数据 - 2020-02-09

    Python 数据分析模块 Pandas 之 Series 数据 - 2020-02-05

    Python 数据分析第三方库 Numpy 的安装和使用 - 2020-02-03


    - 文章评论 -




    1441

    [由于政策原因,您的留言如果提交成功后,需要审核才能展示,请改天再来查看,请不要重复提交,谢谢支持!]

    - 最新评论[0条评论] -


    [>>>点击查看更多评论]

    版权所有©逍遥峡谷 - 星际中心超自然局 · 地球总部 | 逍遥峡谷 · 酷品优选
    Copyright©Interstellar Central Occult Agency (I.C.O.A)
    本局纯属虚构,如有雷同,纯属巧合

    冀公网安备13011102001055号 · 冀ICP备06033848号