本节主要介绍一下Pandas的另外一个数据结构:DataFrame,本文的内容来源:https://www.dataquest.io/mission/147/pandas-internals-dataframesgit
在上一节中已经介绍过了Series对象,Series对象能够理解为由一列索引和一列值,共两列数据组成的结构。而DataFrame就是由一列索引和多列值组成的结构,其中,在DataFrame中的每一列都是一个Series对象。github
无论什么时候,你调用了一个方法返回或者打印一个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) # 打印索引列的值
这是原始的数据:app
在Series中,每个索引都对应着一个值,在DataFrame中,每个索引则对应着一行的数据,能够经过几种方法来选择多数据函数
# 选择前五行 fandango[0:5] # 选择索引号140及其之后的行 fandango[140:] # 只选择索引号为50的那一行 fandango.loc[50] # 选择索引号为45和90的两行 fandango.loc[[45,90]]
总结:要选择连续的多行,就是用列表的切片功能,选择一行就是用loc[]方法或者iloc[]方法(两者的区别能够看个人另外一篇博客“Pandas之让人容易混淆的行选择和列选择“)spa
当选择一行的数据时,Pandas会返回一个Series对象,当选择多行数据时,会返回一个DataFrame对象code
Pandas可使用某一列来从新自定义DataFrame的索引,经过set_index()方法来实现,该方法主要有两个参数:对象
# 我要把电影名称做为该DataFrame的索引 fandango = pd.read_csv('fandango_score_comparison.csv') fandango_films = fandango.set_index('FILM', inplace=False, drop=True)
能够看到索引值已经变了,而且该DataFrame中也移除了名为FILM的列(该列变成了索引)blog
使用了自定义的索引后,相似于以前的行选择同样进行选择,只是把整数索引换成了电影名称而已,例如索引
# 使用切片或者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()方法是运行在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]
# 对选择的列计算总分,在lambda中的x是一个Series,表明了某一列 count = float_df.apply(lambda x: np.sum(x))
若是该方法没有合并运算结果(譬如将整列(行)的值都分别乘2),那么就会返回一个DataFrame。以下
double_df = float_df.apply(lambda x: x*2)
若是要在行上使用apply()方法,只要指定参数axis = 1便可
# 计算每部电影的平均分 means = float_df.apply(lambda x: np.mean(x), axis = 1)