美文网首页呆鸟的Python数据分析
《爱上潘大师》系列-你还记得那年的DataFrame吗

《爱上潘大师》系列-你还记得那年的DataFrame吗

作者: 小一不二三 | 来源:发表于2020-03-15 12:40 被阅读0次

    2020,努力做一个无可替代的人!


    写在前面的话

    如果你还记得那年大明湖畔的xiaoyige,那你就应该来看看这篇文章

    我们学的是技术,小一我写的可是技术文章,哪来那么多情啊爱啊的

    今天的内容很重要的!

    先复习一下前面的文章:

    可能有的同学不理解复习的意义,我简单说一下:

    我写系列文章的时候都会先列好整个系列的大纲,甚至有时候几篇文章是同一天肝出来的。

    这就造成有时候这一篇文章的概念会及其依赖上一篇文章,所以呢,花个两三分钟复习一下上一篇,你会更好理解这篇文章。

    正文

    今天介绍潘大师的另一种数据结构:Dataframe,一个表格型的数据结构。

    对于Series 我们只用了一小节介绍,而Dataframe 可能会用三节内容,孰轻孰重应该都清楚吧

    学习DataFrame,小一建议你最好和Excel表格联系起来

    Excel 表格有行索引、列索引,有数据块,有数据的查找、替换、去重,有数据的透视,汇总,有不同表的数据匹配等等这些。

    DataFrame 的初衷就是为了解决这些问题,简洁、易用的功能也是作者最初的愿景

    所以 ,后面的系列文章,如果你对某个概念不是很理解,想一想 Excel 中是怎么表述的

    创建 DataFrame

    先来一个DataFrame 介绍三连

    DataFrame 有行(索引)、有列(索引),可以看做是由一个个的Series 组成的字典。

    DataFrame 每列可以是不同的值类型(数值、字符串、布尔值)

    DataFrame 中的数据是以一个或多个二维块存放的

    那DataFrame 都有哪些创建方式?

    和NumPy 一样,DataFrame 创建方式也有很多种

    常见的有:

    • 通过二维ndarray 创建

    • 通过字典创建

    • 通过列表创建

    • 通过另一个DataFrame 创建

    下面简单介绍一下常用的,剩下的同学们自己拓展

    通过二维ndarray创建DataFrame

    创建一个二维的ndarray 数组,该数组即DataFrame 的数据集

    # 通过二维ndarray创建DataFrame
    arr_data = np.arange(12).reshape(3, 4)
    df_data1 = pd.DataFrame(arr_data)
    
    # 输出
       0  1   2   3
    0  0  1   2   3
    1  4  5   6   7
    2  8  9  10  11
    

    结果DataFrame 会自动加上行索引和列索引,和Series 的创建一样

    那应该怎么显示声明行、列索引?

    也和Series 的创建一样,在创建的时候手动指定就行

    # 通过二维ndarray创建DataFrame
    columns = ['one', 'two', 'three', 'four']
    index = ['a', 'b', 'c']
    # 显示指定行、列索引
    df_data1 = pd.DataFrame(arr_data, columns=columns, index=index)
    
    # 输出
       one  two  three  four
    a    0    1      2     3
    b    4    5      6     7
    c    8    9     10    11
    

    记住列索引(想要成Excel 的列名):columns

    行索引(想象成Excel 的序号):index

    默认的行列索引都是从0开始

    通过字典创建DataFrame

    这里面的字典包括很多,比如:

    • 数组、元祖 、列表 组成的字典
    • 字典组成的字典(嵌套)
    • Series 组成的字典

    只要数据是字典格式,就可以做数据集

    字典的key作为DataFrame的行索引

    # 通过字典创建DataFrame
    dict_data = {
        'name': ['xiaoyi', 'xiaosi', 'xiaoqi'],
        'age': [11, 14, 17],
        'score': [95.5, 94.5, 97]
    }
    df_data2 = pd.DataFrame(dict_data)
    
    # 输出
         name  age  score
    0  xiaoyi   11   95.5
    1  xiaosi   14   94.5
    2  xiaoqi   17   97.0
    

    列索引是字典的 key 值,行索引自动填充

    当然字典里面的值数据类型你可以尽情变化,Series、元祖、列表等都是可以的

    通过列表创建DataFrame

    同样的,这里的列表类型也不止一种:

    • 字典组成的列表
    • Series 组成的列表
    # 通过列表创建DataFrame
    list_data = [
        {'one': 1, 'two': 2},
        {'one': 1, 'two': 2, 'three': 4}
    ]
    df_data3 = pd.DataFrame(list_data)
    
    # 输出
       one  two  three
    0    1    2    NaN
    1    1    2    4.0
    

    主要就是这三种创建方式,有些书上写的过于复杂,让人眼花缭乱

    万变不离其宗,核心就是这三种

    至于第四种通过其他DataFrame创建,就不多说了吧?

    经常读我文章的同学要是会了前三种,还不会第四种?

    不妨看一下NumPy 的数组创建?顺便反思一下?

    索引对象

    DataFrame 已经创建好了,但是索引还不太明白,是和Series的一样吗?

    能想到Series,说明你差不多都知道是怎么回事了

    构建Series 或者DataFrame 时,所用到的任何数据的标签都会被转换成Index对象

    Index 对象是不可修改的,这样可以保证多个数据结构之间的安全共享

    毕竟人家可是索引,你索引要是都一样了,那到底应该指向谁就说不清了

    我们可以使用重新索引的方法 reindex

    reindex 的用处相当大,我详细介绍一下参数

    reindex(index, method, fille_value, limit, level, copy)

    参数 说明
    index 用作索引的新序列
    method 插值(填充)方式,包括:ffill(前向填充值)、bfill(后向填充值)
    fill_value 在重新索引的过程中,需要引入缺失值时使用的替代值
    limit 前向或后向填充时的最大填充量

    在DataFrame中,存在行、列索引,不同于Series 中只有单一索引。

    所以DataFrame中 reindex 可以行、列索引都修改

    先看单一索引

    # 创建 Series
    series_data = pd.Series([1, 2, 4, 5], index=['a', 'b', 'c', 'e'])
    # 输出
    a    1
    b    2
    c    4
    e    5
    dtype: int64
    
    # 重新索引
    series_data = series_data.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=-1)
    # 输出
    a    1
    b    2
    c    4
    d   -1
    e    5
    dtype: int64
    

    reindex 会根据新索引进行重排,如果某个索引值不存在,则使用 fille_value 的值进行填充

    还记得前面说的DataFrame 中行、列索引分别是什么吗?

    • 行索引:index (想象成Excel 中的序号)
    • 列索引:columns (想象成Excel 中的列标签)
    df_data2
    # 输出
         name  age  score
    0  xiaoyi   11   95.5
    1  xiaosi   14   94.5
    2  xiaoqi   17   97.0
    
    # 行、列重新索引
    columns = ['name', 'age', 'score', 'score2']
    index = [0, 1, 2, 3]
    df_data2 = df_data2.reindex(index=index, columns=columns)
    # 输出
         name   age  score  score2
    0  xiaoyi  11.0   95.5     NaN
    1  xiaosi  14.0   94.5     NaN
    2  xiaoqi  17.0   97.0     NaN
    3     NaN   NaN    NaN     NaN
    

    对行、列都进行重新索引,索引值不存在的会用空值填充

    索引很重要,是Pandas 数据模型的重要部分,但是我们了解上面的内容就够了,也没必要去深究它。

    总结一下:

    今天主要介绍了DataFrame 的创建和索引的相关操作。

    创建方法也是一如既往的多,不过不要慌,真正用起来的时候基本都是从文件中读数据,就一个方法。

    索引这一块不要搞混行索引、列索引。

    对于索引的一些方法最好是掌握,我写出来的都是常用的,不是常用的我也懒得写,你要是还纠结那就查API 文档细品吧

    写在后面的话

    每天进步一点点,学习不就是这么来的吗?

    写这篇文章的时候,我接到了一个关系很好的朋友的消息。

    他的考研成绩公布了,边工作边复习的他,考研历程是我认识的人中最艰难的、最辛苦的。

    等他有空,我去取取经,投稿部分应该会有新文章,期待一下

    碎碎念一下

    上一节碎碎念太多,一下没控制住自己

    算算时间,去年十二月份定下的小目标:每周两篇原创文 ,除了春节期间,应该都实现了。

    原创不易,欢迎点赞噢

    文章首发:公众号【知秋小一】

    文章同步:掘金,简书,csdn

    原文链接:《爱上潘大师》系列- 你还记得那年的DataFrame 吗

    相关文章

      网友评论

        本文标题:《爱上潘大师》系列-你还记得那年的DataFrame吗

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