Pandas介绍与安装
为什么会有Pandas?
Pandas支持大部分Numpy语言风格,尤其是数组函数与广播机制的各种数据处理。但是Numpy更适合处理同质型的数据。而Pandas的设计就是用来处理表格型或异质型数据的,高效的清洗、处理数据。
Pandas是什么?
Pandas是基于Numpy的一种工具,提供了高性能矩阵的运算,该工具是为了解决数据分析任务而创建的。也是贯穿整个Python数据分析非常核心的工具。
Pandas安装
直接在dos命令行中pip install pandas 即可。
Series
Series介绍
Series是一种一维的数组型对象,它包含了一个值序列(values),并且包含了数据标签,称为索引(index)。
- Series创建
pd.Series(data=None,index=None,dtype=None,name=None,copy=False)
data:创建数组的数据,可为array-like, dict, or scalar value
index:指定索引
dtype:数组数据类型
name:数组名称
copy:是否拷贝
(1)、通过列表创建,index索引属性,values数组
fd = pd.Series([1,2,3,4,5])
0 1
1 2
2 3
3 4
4 5
dtype: int64
fd.index
RangeIndex(start=0, stop=5, step=1)
fd.values
array([1, 2, 3, 4, 5], dtype=int64)
fd[1]
2
fd1 = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
fd1
a 1
b 2
c 3
d 4
e 5
dtype: int64
(2)、通过数组创建
fd2 = pd.Series(np.array([1,2,3,4]))
fd2
0 1
1 2
2 3
3 4
dtype: int32
(3)、通过元组创建
fd3 = pd.Series((1,2,3,4))
fd3
0 1
1 2
2 3
3 4
dtype: int64
(4)、通过字典创建
dict1 = {'name':'东方不败','age':18,'sex':'男'}
fd4 = pd.Series(dict1)
fd4
name 东方不败
age 18
sex 男
dtype: object
fd4 = pd.Series(dict1,index=['a','b','c'])
fd4
a NaN
b NaN
c NaN
dtype: object
fd5 = pd.Series(dict1,index=['age','name','sex'])
fd5
age 18
name 东方不败
sex 男
dtype: object
- Series 索引
dict1 = {'name':'东方不败','age':18,'sex':'男'}
fd4 = pd.Series(dict1)
fd4
name 东方不败
age 18
sex 男
dtype: object
fd4.index
Index(['name', 'age', 'sex'], dtype='object')
fd4['name']
'东方不败'
fd4[0]
'东方不败'
fd4[0:2]
name 东方不败
age 18
dtype: object
fd4[::-1]
sex 男
age 18
name 东方不败
dtype: object
fd4[2:0:-1]
sex 男
age 18
dtype: object
- Series 广播、命名、转置、读取等
fd = pd.Series([1,2,3,4,5])
fd
0 1
1 2
2 3
3 4
4 5
dtype: int64
fd+5
0 6
1 7
2 8
3 9
4 10
dtype: int64
fd.name ='人数'
fd.index.name ='班次'
fd
班次
0 1
1 2
2 3
3 4
4 5
Name: 人数, dtype: int64
fd.T
班次
0 1
1 2
2 3
3 4
4 5
Name: 人数, dtype: int64
fd.head(2)
班次
0 1
1 2
Name: 人数, dtype: int64
fd.tail(2)
班次
3 4
4 5
Name: 人数, dtype: int64
DataFrame
DataFrame介绍
DataFrame表示的是矩阵的数据表,它包含已排序的列集合,每一列可以是不同的值类型(数值,字符串,布尔值)。在DataFrame中,数据被存储为一个以上的二维块。
DataFrame创建
pd.DataFrame(data=None,index=None,columns=None,dtype=None,copy=False)
data:创建数组的数据,可为ndarray, dict
index:指定索引
dtype:数组数据类型
copy:是否拷贝
- DateFrame创建数组
1、字典创建,先列后行
data = {'A':[0,1,2],'B':[3,4,5],'C':[6,7,8]}
pd.DataFrame(data)
A B C
0 0 3 6
1 1 4 7
2 2 5 8
a1.index
a1.index
RangeIndex(start=0, stop=3, step=1)
a1.values
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]], dtype=int64)
a1 = pd.DataFrame(data,index=['a','b','c'],columns=['B','A','C'])
a1
B A C
a 3 0 6
b 4 1 7
c 5 2 8
2、字典创建通过Series,先列后行
df2 = pd.DataFrame({'a':pd.Series(np.arange(3)),
'b':pd.Series(np.arange(3,5))})
df2
a b
0 0 3.0
1 1 4.0
2 2 NaN
3、通过字典嵌套,先列后行
data = {
'a':{'apple':3.6,'banana':5.6},
'b':{'apple':3,'banana':5},
'c':{'apple':3.2},
}
df5 = pd.DataFrame(data)
df5
a b c
apple 3.6 3 3.2
banana 5.6 5 NaN
4、通过列表数组,先列后行
arr = np.arange(12).reshape(3,4)
pd.DataFrame(arr)
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
pd.DataFrame(arr,index=['a','b','c'],columns =['A','B','C','D'])
A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
5、通过字典构造的列表,构造DataFrame,按行
l1 = [{'apple':3.6,'banana':5.6},{'apple':3.1,'banana':5.1},{'apple':3.0}]
pd.DataFrame(l1)
apple banana
0 3.6 5.6
1 3.1 5.1
2 3.0 NaN
6、通过Series组成的列表构造DataFrame项目
l2 = [pd.Series(np.arange(3)),pd.Series(np.arange(3,6))]
pd.DataFrame(l2)
0 1 2
0 0 1 2
1 3 4 5
DataFrame查询(先列后行)
import numpy as np
import pandas as pd
dict1 = {'A':[0,1,2],'B':[3,4,5],'C':[6,7,8]}
s = pd.DataFrame(dict1)
s
A B C
0 0 3 6
1 1 4 7
2 2 5 8
s['A']
0 0
1 1
2 2
Name: A, dtype: int64
s.loc[0]
A 0
B 3
C 6
Name: 0, dtype: int64
s['A'][1]
1
DataFrame改(先列后行)
s['B'] = [9,99,99]
s
A B C
0 0 9 6
1 1 99 7
2 2 99 8
s.loc[1] = 8
s
A B C
0 0 9 6
1 8 8 8
2 2 99 8
DataFrame增(先列后行)
s['D'] =1
s
A B C D
0 0 9 6 1
1 8 8 8 1
2 2 99 8 1
s.loc['2'] = 100
s
A B C D
0 0 9 6 1
1 8 8 8 1
2 2 99 8 1
2 100 100 100 100
s.loc[2]=110
s
A B C D
0 0 9 6 1
1 8 8 8 1
2 110 110 110 110
2 100 100 100 100
DataFrame增(先列后行)
del()相于删除了不可恢复,慎用
drop()方法中axis =1 代表列,axis =0 代表行
drop()有一个返回值,但对源数据没有影响
inplace=True时,相当于引用了del语句
dict1 = {'A':[0,1,2],'B':[3,4,5],'C':[6,7,8]}
s1 = pd.DataFrame(dict1)
s1
A B C
0 0 3 6
1 1 4 7
2 2 5 8
s1['D'] = 9
A B C D
0 0 3 6 9
1 1 4 7 9
2 2 5 8 9
del(s1['D'])
s1
A B C
0 0 3 6
1 1 4 7
2 2 5 8
s1['D'] = 10
s1.drop('D',axis =1)
A B C
0 0 3 6
1 1 4 7
2 2 5 8
s1.drop(1,axis = 0)
A B C D
0 0 3 6 10
2 2 5 8 10
s1.drop('C',axis =1,inplace = True)
A B
0 0 3
1 1 4
2 2 5
作业
1、创建一个Series对象
import numpy as np
import pandas as pd
score = pd.Series(data=[90,95,85,78,np.NAN,96,94,np.NAN,80,87,86,83],
index=range(1,13),name='score')
score.index.name = "class"
score
class
1 90.0
2 95.0
3 85.0
4 78.0
5 NaN
6 96.0
7 94.0
8 NaN
9 80.0
10 87.0
11 86.0
12 83.0
Name: score, dtype: float64
2、查看1-5班的成绩
import pandas as pd
score[0:5]
class
1 90.0
2 95.0
3 85.0
4 78.0
5 NaN
Name: score, dtype: float64
3、查看哪个班级的成绩没有录入
思路:把NAN数据替换成0,然后取0值对应的index
score1 = score.fillna(0)
score1[score1.values ==0].index
Int64Index([5, 8], dtype='int64', name='class')
4、获取11班的成绩
score[11]
86.0
5、在每个人的成绩加5分
score+5
class
1 95.0
2 100.0
3 90.0
4 83.0
5 NaN
6 101.0
7 99.0
8 NaN
9 85.0
10 92.0
11 91.0
12 88.0
Name: score, dtype: float64
6、找出成绩在90分以上的班级
score[score.values>90].index
Int64Index([2, 6, 7], dtype='int64', name='class')
7、创建一个DataFrame
import numpy as np
import pandas as pd
data = {
"姓名":['张三','李四','王五','小明','小红','小刚','小亮'],
"语文":[89,78,79,89,90,87,83],
"数学":[59,83,85,92,67,81,77],
"英语":[84,97,88,83,67,73,71],
"体育":[0,0,0,0,0,0,0]
}
df = pd.DataFrame(data)
df
姓名 语文 数学 英语 体育
0 张三 89 59 84 0
1 李四 78 83 97 0
2 王五 79 85 88 0
3 小明 89 92 83 0
4 小红 90 67 67 0
5 小刚 87 81 73 0
6 小亮 83 77 71 0
8、进行转置
df.T
0 1 2 3 4 5 6
姓名 张三 李四 王五 小明 小红 小刚 小亮
语文 89 78 79 89 90 87 83
数学 59 83 85 92 67 81 77
英语 84 97 88 83 67 73 71
体育 0 0 0 0 0 0 0
9、删除掉体育成绩
df.drop('体育',axis =1,inplace = True)
df
姓名 语文 数学 英语
0 张三 89 59 84
1 李四 78 83 97
2 王五 79 85 88
3 小明 89 92 83
4 小红 90 67 67
5 小刚 87 81 73
6 小亮 83 77 71
10、添加‘综合’这个课程的成绩 (成绩自定义)
df['综合']=0
df
姓名 语文 数学 英语 综合
0 张三 89 59 84 0
1 李四 78 83 97 0
2 王五 79 85 88 0
3 小明 89 92 83 0
4 小红 90 67 67 0
5 小刚 87 81 73 0
6 小亮 83 77 71 0