教程来源:https://github.com/datawhalechina/joyful-pandas
理论部分
1.掌握常见文件格式的读写操作
2.理解并熟悉 Series 和 DataFrame 的重要属性和重要方法
3.掌握各类排序(索引排序和值排序、单级排序和多级排序)
练习部分
1.《权利的游戏》剧本数据集分析
2.科比投篮数据集分析
拿到数据必然先要读取它,分析完了数据必然是要保存它,读取了数据之后,我们面对了怎样的对象(Series? or Dataframe?)是第一重要的课题,因此了解序列和数据框的常规操作及其组件(component)便是必须涉及的内容
以下为全部学习代码:
分为四个部分:
一、文件读取与写入
二、基本数据结构
三、常用基本函数
四、排序
#Task01:Pandas基础
import pandas as pd
import numpy as np
#查看pandas版本
pd.__version__
#一、文件读取与写入
#1. 读取
#(a)csv格式
df = pd.read_csv('data/table.csv')
df.head()
#(b)text格式
df_text=pd.read_table('data/table.txt')
df_text
#(c)xls或xlsx格式
df_excel=pd.read_excel('data/table.xlsx')
df_excel.head()
#2.写入
#(a)csv格式
df.to_csv('data/new_table.csv')
#df.to_csv('data/new_table.csv', index=False) #保存时除去行索引
#(b)xls或xlsx格式
#需要安装openpyxl
df.to_excel('data/new_table2.xlsx', sheet_name='Sheet1')
#二、基本数据结构
#1. Series
#(a)创建一个Series
#对于一个Series,其中最常用的属性为值(values),索引(index),名字(name),类型(dtype)
s = pd.Series(np.random.randn(5),index=['a','b','c','d','e'],name='这是一个Series',dtype='float64')
s
#(b)访问Series属性
s.values
s.name
s.index
s.dtype
#2. DataFrame
#(a)创建一个DataFrame
df = pd.DataFrame({'col1':list('abcde'),'col2':range(5,10),'col3':[1.3,2.5,3.6,4.6,5.8]},
index=list('一二三四五'))
df
#(b)从DataFrame取出一列为Series
df['col1']
type(df)
type(df['col1'])
#(c)修改行或列名
df.rename(index={'一':'one'},columns={'col1':'new_col1'})
#(d)调用属性和方法
df.index
df.columns
df.values
df.shape
df.mean()##本质上是一种Aggregation操作,将在第3章详细介绍
#(e)索引对齐特性
#这是Pandas中非常强大的特性,不理解这一特性有时就会造成一些麻烦
df1 = pd.DataFrame({'A':[1,2,3]},index=[1,2,3])
df2 = pd.DataFrame({'A':[1,2,3]},index=[3,1,2])
df1-df2 #由于索引对齐,因此结果不是0
#(f)列的删除与添加
#对于删除而言,可以使用drop函数或del或pop
df.drop(index='五',columns='col1') #设置inplace=True后会直接在原DataFrame中改动
#或者del
df['col1']=[1,2,3,4,5]
del df['col1']
df
#或者,pop方法直接在原来的DataFrame上操作,且返回被删除的列,与python中的pop函数类似
df['col1']=[1,2,3,4,5]
df.pop('col1')
df
#可以直接增加新的列,也可以使用assign方法
df1['B']=list('abc')
df1
df1.assign(C=pd.Series(list('def')))
df1 #但assign方法不会对原DataFrame做修改
#(g)根据类型选择列
df.select_dtypes(include=['number']).head()
df.select_dtypes(include=['float']).head()
#(h)将Series转换为DataFrame
s = df.mean()
s.name='to_DataFrame'
s
s.to_frame()
#使用T符号可以转置
s.to_frame().T
#三、常用基本函数
#从下面开始,包括后面所有章节,我们都会用到这份虚拟的数据集
df = pd.read_csv('data/table.csv')
#1. head和tail
df.head()
df.tail()
#可以指定参数n显示多少行
df.head(3)
#2. unique和nunique
#nunique显示有多少个唯一值
df['Physics'].nunique()
#unique显示所有的唯一值
df['Physics'].unique()
#3. count和value_counts
#count返回非缺失值元素的个数
df['Physics'].count()
#value_counts返回每个元素有多少个
df['Physics'].value_counts()
#4.describe和info
#info函数返回有哪些列、有多少非缺失值、每列的类型
df.info()
#describe默认统计数值型数据的各个统计量
df.describe()
#可以自行选择分位数
df.describe(percentiles=[.05, .25, .75, .95])
#对于非数值型也可以用describe函数
df['Physics'].describe()
#5.idxmax和nlargest
#idxmax函数返回最大值,在某些情况下特别适用,idxmin功能类似
df['Math'].idxmax()
#nlargest函数返回前几个大的元素值,nsmallest功能类似
df['Math'].nlargest(3)
#6. clip和replace
#clip和replace是两类替换函数¶
#clip是对超过或者低于某些值的数进行截断
df['Math'].head()
df['Math'].clip(33,80).head()
df['Math'].mad()
#replace是对某些值进行替换
df['Address'].head()
df['Address'].replace(['street_1','street_2'],['one','two']).head()
#通过字典,可以直接在表中修改
df.replace({'Address':{'street_1':'one','street_2':'two'}}).head()
#7. apply函数
#apply是一个自由度很高的函数,在第3章我们还要提到
#对于Series,它可以迭代每一列的值操作:
df['Math'].apply(lambda x:str(x)+'!').head() #可以使用lambda表达式,也可以使用函数
#对于DataFrame,它可以迭代每一个列操作:
df.apply(lambda x:x.apply(lambda x:str(x)+'!')).head() #这是一个稍显复杂的例子,有利于理解apply的功能
#四、排序
#1. 索引排序
df.set_index('Math').head() #set_index函数可以设置索引,将在下一章详细介绍
df.set_index('Math').sort_index().head() #可以设置ascending参数,默认为升序,True
#2.值排序
df.sort_values(by='Class').head()
#多个值排序,即先对第一层排,在第一层相同的情况下对第二层排序¶
df.sort_values(by=['Address','Height']).head()
课后问题与练习:
【问题一】 Series和DataFrame有哪些常见属性和方法?
【答】查看第三部分基本数据结构Series和DataFrame。
series是一种类似于一维数组的对象,由一组数据和一组标签(index)组成。一组数据也可以产生简单的series对象。dataframe是pandas中的一个表格型数据结构,有行索引也有列索引,可以看做事series组成的字典。
【问题二】 value_counts会统计缺失值吗?
【答】不会。value_counts返回每个元素有多少个,并不包含缺失值
【问题三】 与idxmax和nlargest功能相反的是哪两组函数?
【答】idxmin和nsmallest。
【问题四】 在常用函数一节中,由于一些函数的功能比较简单,因此没有列入,现在将它们列在下面,请分别说明它们的用途并尝试使用sum/mean/median/mad/min/max/abs/std/var/quantile/cummax/cumsum/cumprod
【答】求和/求平均值/求中位数/求平均绝对方差(Mean absolute deviation)/求最小值/求最大值/求绝对值/求标准差(Bessel-corrected sample standard deviation)/求方差(Unbiased variance)/求分位数(sample quantile value at %)/求累最大值(cumulative maximum)/求累加(cumulative sum)/求累乘(cumulative product)
【问题五】 df.mean(axis=1)是什么意思?它与df.mean()的结果一样吗?第一问提到的函数也有axis参数吗?怎么使用?
【答】axis=1’行’,默认为0即’列’,因此结果不同