为什么要学习pandas?
- numpy已经可以帮助我们进行数据的处理了,那么学习pandas的目的是什么呢?
- numpy能够帮助我们处理的是数值型 的数据,当然在数据分析中除了数值型的数据还有好多其他类型的数据(字符串,时间序列),那么pandas就可以帮我们很好的处理除了数值型的其他数据!
什么是pandas?
- 首先先来认识pandas中的两个常用的类
- Series
- DataFrame
Series
-
Series是一种类似与一维数组的对象,由下面两个部分组成:
- values:一组数据(ndarray类型)
- index:相关的数据索引标签
-
Series的创建
-
由列表或numpy数组创建
-
由字典创建
from pandas import Series
s = Series(data=[1,2,3,'four]) # 创建一个有索引的数据
s
代码结果:
0 1
1 2
2 3
3 four
dtype: objectimport numpy as np
s = Series(data = np.random.randint(0,100,size=(3,))) # 使用numpy模块和pandas模块中的Series类,创建一个3行0列的简单表格
s
代码结果:
0 3
1 43
2 82
dtype: int64from pandas import Series
s = Series(data=[1,2,3,'four'],index=['a','b','c','d']) # 创建一个表格,行索引是a,b,c,d 对应的值是data中的元素
s
代码结果:
a 1
b 2
c 3
d four
dtype: object
-
为什么需要有显示索引
#### 显示索引可以增强Series的可读性
form pandas import Series
dic ={
'语文':100,
'数学':120,
'英语':125,
}
s = Series(data=dic)
s
代码结果:
语文 100
数学 99
理综 250
dtype: int64
Series的索引和切片
from pandas import Series
dic = {
'语文':100,
'数学':120,
'英语':125
}
s = Series(data=dic)
s
代码结果:
语文 100
数学 120
理综 125
dtype: int64
s[0] # 取出索引为0,第一行语文的数据
s.语文 # 直接取出语文这一行的数据
s.[0:2] # 取出索引0-2的数据,就是语文、数学这两行
Series的常用属性
- s.shape 显示元素的行数
- s.size 显示元素的个数,索引
- s.index 元素的列索引
- s.values 返回值
- s.dtype 元素的类型
Series的常用方法
-
head(),tail()
-
unique()
-
isnull(),notnull()
-
add() sub() mul() div()
import numpy as np from pandas import Series s = Series(data = np.random.randint(1,100),size=(4,)) 代码结果: 0 12 1 51 2 50 3 96 dtype: int32 s.head(2) # 显示前2行的数据 代码结果: 0 12 1 51 dtype: int32 s.tail(2) # 显示后3个数据 代码结果: 0 12 1 51 dtype: int32 s.unique() # 去重 代码结果: array([12, 51, 50, 96]) s.isnull() # 用于判断每一个元素是否为空,为空返回True,否则返回False 代码结果: 0 False 1 False 2 False 3 False dtype: bool s.notnull() 代码结果: 0 False 1 False 2 False 3 False dtype: bool
DataFrame
-
DataFrame是一个【表格型】的数据结构。DataFrame由按一定顺序排列的多列数据组成。设计初衷是将Series的使用场景从一维拓展到多维。DataFrame既有行索引,也有列索引。
- 行索引:index
- 列索引:columns
- 值:values
-
DataFrame的创建
-
ndarray创建
-
字典创建
from pandas import DataFrame
df = DataFrame(data=([1,2,3],[1,2,3])) 创建一个二维的表格
df
代码结果:0 1 2 0 1 2 1 1 2 from pandas import DataFrame
import numpy as np
df = DataFrame(data=np.random.randint(1,100,size=(3,4)))
df
代码结果:0 1 2 3 0 9 68 39 1 86 83 53 2 68 82 80 import numpy as np
from pandas import DataFrame
dic = {
'name':['zt','cy','xcy'],
'salary':[1000,2000,3000]
}df = DataFrame(data=dic,index=['a','b','c'])
df
代码结果:----- name salary a zt 1000 b cy 2000 c xcy 3000
-
DataFrame的属性
-
values、columns、index、shape
-
df.values:
array([['zt', 1000], ['cy', 2000], ['xcy', 3000]], dtype=object)
-
df.columns:
Index(['name', 'salary'], dtype='object')
-
df.index:
Index(['a', 'b', 'c'], dtype='object') </details>
-
df.shape:
(3, 2)
-
-
练习:
根据以下考试成绩表,创建一个DataFrame,命名为df:
张三 李四 语文 150 0 数学 150 0 英语 150 0 理综 300 0 import numpy as np from pandas import DataFrame dic = { '张三':[150,150,150,150], '李四':[0,0,0,0], } df = DataFrame(data=dic,index=['语文','数学','英语','理综']) df
DataFrame索引操作
-
对行进行索引
import numpy as np from pandas import DataFrame df = DataFrame(data = np.random.randint(1,100,size=(4,5)),index=['a','b','c','d']) df 代码结果: | 0 | 1 | 2 | 3 | 4 | | ---- | ---- | ---- | ---- | ---- | | a | 72 | 4 | 35 | 97 | | b | 53 | 36 | 4 | 75 | | c | 65 | 35 | 25 | 55 | | d | 8 | 68 | 52 | 33 |
-
对列进行索引
import numpy as np from pandas import DataFrame df = DataFrame(data = np.random.randint(1,100,size=(9,5)),columns=['a','b','c','d','e']) df 代码结果: | a | b | c | d | e | | ---- | ---- | ---- | ---- | ---- | | 0 | 87 | 35 | 75 | 10 | | 1 | 12 | 83 | 11 | 14 | | 2 | 57 | 8 | 62 | 99 | | 3 | 29 | 55 | 96 | 37 | | 4 | 66 | 65 | 1 | 94 | | 5 | 32 | 54 | 17 | 75 | | 6 | 48 | 26 | 65 | 46 | | 7 | 3 | 6 | 10 | 14 | | 8 | 14 | 26 | 32 | 96 |
-
对元素进行索引
df['a'] # 取单列,如果df有显示的索引,通过索引机制去行或者列的时候只可以使用显示索引 df[['a','c']] # 取多列 iloc: # 通过隐式索引取行 loc: # 通过显示索引取行 df.loc[0] # 取单行 df.iloc[[0,3,5]] # 取多行 #取单个元素 df.iloc[0,2] df.loc[0,'a'] #取多个元素 df.iloc[[1,3,5],2]
DataFrame的切片操作
-
对行进行切片
| a | b | c | d | | ---- | ---- | ---- | ---- | | 0 | 95 | 87 | 83 | | 1 | 76 | 82 | 78 | | 2 | 69 | 94 | 89 | | 3 | 74 | 77 | 93 | | 4 | 75 | 88 | 93 | | 5 | 67 | 98 | 66 | | 6 | 95 | 83 | 71 | | 7 | 72 | 74 | 79 | df[0:2] # 切行 代码结果: | a | b | c | d | | ---- | ---- | ---- | ---- | | 0 | 95 | 87 | 83 | | 1 | 76 | 82 | 78 | df.iloc[:,0:2] # 切列 代码结果: | a | b | | ---- | ---- | | 0 | 95 | | 1 | 76 | | 2 | 69 | | 3 | 74 | | 4 | 75 | | 5 | 67 | | 6 | 95 | | 7 | 72 |
-
对列进行切片
df.iloc[:,0:2] # 切列 代码结果: | a | b | | ---- | ---- | | 0 | 95 | | 1 | 76 | | 2 | 69 | | 3 | 74 | | 4 | 75 | | 5 | 67 | | 6 | 95 | | 7 | 72 |
总结:df索引和切片操作
- 索引:
- df[col]:取列
- df.loc[index]:取行
- df.iloc[index,col]:取元素
- 切片:
- df[index1:index3]:切行
- df.iloc[:,col1:col3]:切列
练习题:
1. 假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。
import numpy as np
from pandas import DataFrame
dic1 ={
'张三':[150,150,150,150],
'李四':[0,0,0,0]
}
dic2={
'张三':[120,120,120,120],
'李四':[15,15,15,15]
}
ddd = DataFrame(data=dic1,index=['语文','数学','英语','理综'])
ddd2 = DataFrame(data=dic2,index=['语文','数学','英语','理综'])
(ddd + ddd2) / 2 # 其中期末的平均值
代码结果:
| 张三 | 李四 |
| ---- | ----- |
| 语文 | 135.0 |
| 数学 | 135.0 |
| 英语 | 135.0 |
| 理综 | 135.0 |
2. 假设张三期中考试数学被发现作弊,要记为0分,如何实现?
dd.loc['数学','张三'] = 0
ddd
代码结果:
| 张三 | 李四 |
| ---- | ---- |
| 语文 | 150 |
| 数学 | 0 |
| 英语 | 150 |
| 理综 | 150 |
3. 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
ddd['李四'] += 100
ddd
代码结果:
| 张三 | 李四 |
| ---- | ---- |
| 语文 | 150 |
| 数学 | 0 |
| 英语 | 150 |
| 理综 | 150 |
4. 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?
ddd += 10
ddd
代码结果:
| 张三 | 李四 |
| ---- | ---- |
| 语文 | 160 |
| 数学 | 10 |
| 英语 | 160 |
| 理综 | 160 |
拓展:时间数据类型的转换
-
pd.to_datetime(col)
-
将某一列设置为行索引
-
df.set_index()
dic = {
'time':['2010-10-10','2011-11-20','2020-01-10'],
'temp':[33,31,30]
}
df = DataFrame(data=dic)
df| | time | temp |
| ---- | ---------- | |
| 0 | 2010-10-10 | 33 |
| 1 | 2011-11-20 | 31 |
| 2 | 2020-01-10 | 30 |#查看time列的类型
df['time'].dtype
dtype('O')import pandas as pd
#将time列的数据类型转换成时间序列类型
df['time'] = pd.to_datetime(df['time'])
df['time']#将time列作为源数据的行索引
df.set_index('time',inplace=True)
-