• Pandas简易入门(四)


    本节主要介绍一下Pandas的另一个数据结构:DataFrame,本文的内容来源:https://www.dataquest.io/mission/147/pandas-internals-dataframes

    在上一节中已经介绍过了Series对象,Series对象可以理解为由一列索引和一列值,共两列数据组成的结构。而DataFrame就是由一列索引和多列值组成的结构,其中,在DataFrame中的每一列都是一个Series对象。

     

    行选择

    不管何时,你调用了一个方法返回或者打印一个DataFrame时,最左边的一列必然是索引值,可以通过index属性来直接访问DataFrame的索引值,本节所用的数据来源于:https://github.com/fivethirtyeight/data/tree/master/fandango

    import pandas as pd
    
    fandango = pd.read_csv('fandango_score_comparison.csv')
    
    # print(fandango.head(2))  输出前两行
    
    print(fandango.index)  # 打印索引列的值

    Image 001

    这是原始的数据:

    Image 003

     

    在Series中,每一个索引都对应着一个值,在DataFrame中,每一个索引则对应着一行的数据,可以通过几种方法来选择多数据

    # 选择前五行
    
    fandango[0:5]
    
    # 选择索引号140及其以后的行
    
    fandango[140:]
    
    # 只选择索引号为50的那一行
    
    fandango.loc[50]
    
    # 选择索引号为45和90的两行
    
    fandango.loc[[45,90]]

    总结:要选择连续的多行,就是用列表的切片功能,选择一行就是用loc[]方法或者iloc[]方法(二者的区别可以看我的另一篇博客“Pandas之让人容易混淆的行选择和列选择“)

    当选择一行的数据时,Pandas会返回一个Series对象,当选择多行数据时,会返回一个DataFrame对象

     

    自定义索引

    Pandas可以使用某一列来重新自定义DataFrame的索引,通过set_index()方法来实现,该方法主要有两个参数:

    • inplace,如果设置为True就不会返回一个新的DataFrame,而是直接修改该DataFrame
    • drop,如果设置为True,就会移出掉该列的数据
    # 我要把电影名称作为该DataFrame的索引
    
    fandango = pd.read_csv('fandango_score_comparison.csv')
    
    fandango_films = fandango.set_index('FILM', inplace=False, drop=True)

    Image 002

    可以看到索引值已经变了,并且该DataFrame中也移除了名为FILM的列(该列变成了索引)

    使用了自定义的索引后,类似于之前的行选择一样进行选择,只是把整数索引换成了电影名称而已,例如

    # 使用切片或者loc[]函数
    
    fandango_films["Avengers: Age of Ultron (2015)":"Hot Tub Time Machine 2 (2015)"]
    
    fandango_films.loc["Avengers: Age of Ultron (2015)":"Hot Tub Time Machine 2 (2015)"]
    
    # 指定要返回的电影
    
    fandango_films.loc['Kumiko, The Treasure Hunter (2015)']
    
    # 选择要返回的多部电影
    
    movies = ['Kumiko, The Treasure Hunter (2015)', 'Do You Believe? (2015)', 'Ant-Man (2015)']
    
    fandango_films.loc[movies]

     

     

    Apply方法

    apply()方法是运行在Series对象中的,而Pandas中任何单独一列或者单独一行的数据就是一个Series对象,apply()方法中要传递的是一个向量运算方法

    如果该方法返回一个单独的值(譬如将整列(行)的值相加),那么就会返回一个Series,该Series保存的是全部列的运行结果,如下

    import numpy as np
    
    # 得出每一列的数据类型
    
    types = fandango_films.dtypes
    
    # 选择具有浮点数据的那些列
    
    float_columns = types[types.values == 'float64'].index
    
    float_df = fandango_films[float_columns]

    Image 009

    # 对选择的列计算总分,在lambda中的x是一个Series,代表了某一列
    
    count = float_df.apply(lambda x: np.sum(x))

    Image 008

    如果该方法没有合并运算结果(譬如将整列(行)的值都分别乘2),那么就会返回一个DataFrame。如下

    double_df = float_df.apply(lambda x: x*2)

    Image 007

     

    如果要在行上使用apply()方法,只要指定参数axis = 1即可

    # 计算每部电影的平均分
    
    means = float_df.apply(lambda x: np.mean(x), axis = 1)

    Image 010

  • 相关阅读:
    自定义ViewGroup基础巩固2---onMeasure()学习及综合实现圆形菜单
    Django自定义模板函数
    django迁移:全局、局部
    setup.py
    企鹅去北极熊家里玩
    python插入记录后获取最后一条数据的id
    清除浮动和解决塌陷
    html知识代码
    django模型:为已存在的表建立模型
    django模型:字段和选项
  • 原文地址:https://www.cnblogs.com/kylinlin/p/5231328.html
Copyright © 2020-2023  润新知