一、为什么学习pandas
- numpy已经可以帮助我们进行数据的处理了,那么学习pandas的目的是什么呢?
- numpy能够帮助我们处理的是数值型的数据,当然在数据分析中除了数值型的数据还有好多其他类型的数据(字符串,时间序列),那么pandas就可以帮我们很好的处理除了数值型的其他数据!
二、什么是pandas?
- 首先先来认识pandas中的两个常用的类
- Series
- DataFrame
1.Series的创建
- 由列表或numpy数组创建
- 由字典创建
-
#series只能创建一维数组
-
import numpy as np
-
import pandas as pd
-
from pandas import Series,DataFrame
-
#使用列表创建数组
-
s=Series(data=[1,2,3,4,5])
-
s
-
#numpy数组创建
-
s1=Series(data=np.random.randint(1,100,size=(2,)))
-
s1
Series(data=[1,2,3],index=['a','b','c'])#index是用来指定显示索引,显示索引不会覆盖隐示索引
1.2.Series的索引和切片
-
s = Series(data=[1,2,3,4,5],index=['a','b','c','d','e'])
-
s
-
#索引操作
-
s = Series(data=[1,2,3,4,5],index=['a','b','c','d','e'])
-
print(s[0])#查找索引为0的元素
-
print(s['a'])#查找索引为0的元素
-
print(s.a)
-
print(s[[1,2]])#查找索引为0的元素
-
#切片
-
s[0:3]
-
s['a':'c']
1.3.Series的常用属性
- shape
- size
- index
- values
-
print(s.shape)
-
print(s.size)
-
print(s.index)
-
print(s.values)
1.4.Series的常用方法
- head(),tail()
- unique()
- isnull(),notnull()
- add() sub() mul() div()
-
s.head(2)#显示前n个元素
-
s.tail(2)#后n个元素
-
s = Series(data=[1,1,2,2,3,4,5])
-
s.unique()#去重
s.nunique() #返回去重之后元素的个数
s.isnull() #isnull使用来检测元素是否为空
s.notnull()#用来检测元素是否为非空
-
#add()为例
-
a = pd.Series([1, 1, 1, np.nan], index=['a', 'b', 'c', 'd'])
-
b = pd.Series([1, np.nan, 1, np.nan], index=['a', 'b', 'd', 'e'])
-
a.add(b, fill_value=0)
-
print(a)
-
print(b)
-
print(a.add(b,fill_value=0))
1.5.Series的算术运算
- 法则:索引一致的元素进行算数运算否则补空
-
s1 = Series(data=[1,2,3],index=['a','b','c'])
-
s2 = Series(data=[1,2,3],index=['a','d','c'])
-
s = s1+s2
-
s
s.isnull()
s.notnull()
2.DataFrame
- DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
- 行索引:index
- 列索引:columns
- 值:values
2.1DataFrame的创建
-
- ndarray创建
- 字典创建
-
#ndarray创建
-
import numpy as np
-
import pandas as pd
-
from pandas import Series,DataFrame
-
df=DataFrame(np.array([[1,2,33],[6,4,8]]))
-
df
-
#或者DataFrame(data=[[1,2,33],[6,4,8]])
-
#使用元祖创建
-
dic = {
-
'name':['tom','jay','salay'],
-
'salary':[10000,2000,15000]
-
}
-
DataFrame(dic)
-
df =DataFrame(data=np.random.randint(0,100,size=(3,2)),index=['a','b','c'],columns=['A','B'])
-
df
2.2DataFrame的属性
- values、columns、index、shape
-
print(df.values)
-
print(df.columns)
-
print(df.index)
-
print(df.shape)
练习1:
根据以下考试成绩表,创建一个DataFrame,命名为df:
-
张三 李四
-
语文 150 0
-
数学 150 0
-
英语 150 0
-
理综 300 0
代码
-
import numpy as np
-
import pandas as pd
-
from pandas import Series,DataFrame
-
df=DataFrame(data=[[150,0],[150,0],[150,0],[300,0]],columns=['张三','李四'],index=['语文','数学','英语','理综'])
-
df
2.3DataFrame索引操作(*重点)
- 对行进行索引
- 队列进行索引
- 对元素进行索引
-
df = DataFrame(data=np.random.randint(0,100,size=(5,4)),columns=['a','b','c','d'],index=['A','B','C','D','E'])
-
df
-
#索引取列
-
df['a']#显示索引取列
-
df.iloc[:,0] #隐式索引取列
-
df.a
-
#取行
-
df.iloc[0] #隐式索引取行
-
df.loc['A'] #显示索引取行
- iloc:
- 通过隐式索引取行
- loc:
- 通过显示索引取行
-
#取元素
-
df.loc['B','b']
-
df.iloc[1,1]
-
df.iloc[[0,1],2]
2.4DataFrame的切片操作
- 对行进行切片
- 对列进行切片
-
#切行
-
df[0:2]
-
#切列
-
df.iloc[:,0:2]
总结:
- df索引和切片操作
- 索引:
- df[col]:取列
- df.loc[index]:取行
- df.iloc[index,col]:取元素
- 切片:
- df[index1:index3]:切行
- df.iloc[:,col1:col3]:切列
- 索引:
2.5DataFrame的运算
- 同Series
练习2:
- 假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。
- 假设张三期中考试数学被发现作弊,要记为0分,如何实现?
- 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
- 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?
-
#先建表,期中ddd和期末ddd2两张表
-
import pandas
-
from pandas import Series,DataFrame
-
dic={
-
'张三':[150,150,150,300],
-
'李四':[0,0,0,0],
-
'王五':[120,97,114,130]
-
}
-
df=DataFrame(data=dic,index=['语文','数学','英语','理综'])
-
ddd=df
-
ddd2=df
-
print(ddd)
-
print(ddd2)
-
#1.假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。
-
(ddd+ddd2)/2
-
#2.假设张三期中考试数学被发现作弊,要记为0分,如何实现?
-
#先找到ddd中数学-张三成绩,然后再赋值为0
-
ddd.loc['数学','张三']=0
-
ddd.loc['数学','张三']
-
#3.李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
-
#找到ddd表中李四的所有成绩(列),然后+100
-
ddd['李四']+=100
-
ddd['李四']
-
#4.来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?
-
ddd+=10
-
ddd