前言
2023/10/30
这是一篇关于Pandas库的学习笔记!
提示:以下是本篇文章正文内容,下面案例可供参考
一、Pandas数据结构
1.1 Series对象
-
Series是一种一维的数组型对象,它除了包含值序列外(与NumPy中的一维ndarry类型相似),还包含数据标签,后面我们称其为索引(index)。
-
Series对象不仅存储值序列,而且存储数据标签,因此每个Series对象都具有两个属性。
- index属性:RangeIndex索引对象,如果创建Series对象时不指定index属性,那么系统会默认生成,默认生成的索引是从0到N-1(N是数据长度)。
- values属性:保存元素值的ndarray数组,NumPy函数都是对此进行操作。
1.1.1创建Series对象
- 用列表生成Series
import pandas as pd
ser=pd.Series([1,2,3])
ser.index
ser.values
RangeIndex(start=0, stop=3, step=1)
array([1, 2, 3], dtype=int64)
- 用字典创建Series
【实例】从字典创建Series对象(不指定index属性)。
dictSer=pd.Series({'a':11,'b':12,'c':13,'d':14,'e':15,'f':16})
dictSer
a 1
b 2
c 3
d 4
e 5
dtype: int64
【实例】从字典创建Series对象并指明index属性,且index属性是字典键中的部分值。
dictSer=pd.Series({'a':10,'b':40,'c':5,'d':90,'e':35,'f':40},index=['a','b','e'])
dictSer
a 10
b 40
e 35
dtype: int64
解释:从字典生成Series对象,并且在Series对象中设置index属性时,如果index属性是字典中的部分键值,就相当于从字典中挑选数据。
【实例】从字典创建Series对象并指明index属性,且index属性中存在部分标签不在字典的键中。
dictSer=pd.Series({'a':10,'b':40,'c':5,'d':90,'e':35,'f':40},index=['a','b','e','k'])
dictSer
a 10.0
b 40.0
e 35.0
k NaN
dtype: float64
- 用ndarray数组创建Series对象
略
1.1.2 Series对象的name属性
- Series对象本身和其索引对象都有name属性,这个特性与Pandas的其他功能集成在一起,所以一定要掌握它的name属性。
serp.name="price";
serp.index.name="product"
serp
product
a 11
b 12
c 13
d 14
e 15
Name: price, dtype: int32
1.2DataFrame对象
DataFrame对象表示的是矩阵的数据结构,这种数据结构与Excel表相似,其设计初衷是将Series对象的使用场景由一维扩展到多维。DataFrame对象由按一定顺序排列的多列数据组成,其中每列的数据类型必须一致,而各个列的数据类型可以不同(可以是数值、字符串、布尔值等类型)。DataFrame对象既有行索引也有列索引,因此可以把它看作一个具有共同索引的Series字典。
DataFrame对象有data、index和columns这3个属性,分别表示数据、行索引和列索引。
- data属性: ndarray多维数组对象,存储DataFrame对象的值数据。
- index属性:RangeIndex索引对象,存储行索引,如果创建DataFrame对象时不指定index属性,那么系统会生成默认行索引,默认生成的行索引是从0到N-1(N是data的行数)。
- columns属性:RangeIndex索引对象,存储列索引,如果创建DataFrame对象时不指定columns属性,那么系统生成默认列索引,默认生成的列索引是从0到M-1(M是data的列数)。
1.2.1 创建DataFrame对象
- 调用DataFrame()构造函数
df=pd.DataFrame(data=[[1,2,3],[1,2,3],[1,2,3]],columns=['c1','c2','c3'],index=["r1","r2","r3"])
c1 c2 c3
r1 1 2 3
r2 1 2 3
r3 1 2 3
- 用包含Numpy数组的字典创建DataFrame对象
data1 = {'English' : [74,85,96], 'Math' : [87,78,89],'Chinese' : [81, 92,83],};
df1 = pd.DataFrame(data1);
Chinese English Math
0 81 74 87
1 92 85 78
2 83 96 89
- 对DataFrame对象设置索引
df2=pd.DataFrame(data1,index=['zhangsan','lisi','wangwu'])
Chinese English Math
zhangsan 81 74 87
lisi 92 85 78
wangwu 83 96 89
- 如果设置的列索引中的某项不在字典的键中,则该项会显示为缺失值NaN定义行索引。
df4=pd.DataFrame(data1,columns=['Math','Chinese','Eng'],index=['zhangsan','lisi','wangwu'])
- 使用字典构成的列表来创建DataFrame对象
data4=[{'Chinese':81,'English':74,'Math':87},{'Chinese':92,'English':85,
'Math':78},{'Chinese':83,'English':96,'Math':89}]
df4 = pd.DataFrame(data4,index=['zhangsan','lisi','wangwu'])
二、索引对象
Pandas中索引对象用于存储轴标签和其他元数据,在构造Series和DataFrame对象时,用户所使用的标签序列都会在内部转化为索引对象。索引不仅有一级,还可以有多级,下面介绍两种索引对象,即Index索引对象和MultiIndex多级索引对象。
2.1 Index索引对象
Index索引对象保存索引标签数据,其values属性可以获得保存标签的列表,其name属性可以获得标签的名称。
- 创建并返回一个Series对象的Index索引对象
ser1=pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
ser_index=ser1.index
ser_index.values
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
array(['a', 'b', 'c', 'd', 'e'], dtype=object)
- 创建一个DataFrame对象的Index索引对象。
data1 = {'English' : [74,85,96], 'Math' : [87,78,89],'Chinese' : [81,92,83],}
df4=pd.DataFrame(data1,columns=['Math','Chinese','English'],index=['zhangsan',
'lisi','wangwu'])
df_index1=df4.index
Index(['zhangsan', 'lisi', 'wangwu'], dtype='object')
解释:可以把Index索引对象看作一维数组,通过与NumPy中的数组相同的下标和切片方式得到一个新的Index索引对象。但是Index索引对象是只读的,因此一旦创建就无法修改其中的元素。
- 调用Index()函数直接创建Index索引对象
index1=pd.Index(['a','b','c','d','e'],name="name")
ser1=pd.Series([1,2,3,4,5],index=index1)
ser1.index
Index(['a', 'b', 'c', 'd', 'e'], dtype='object', name='name')
Multilndex多级索引对象
MultiIndex是多级索引对象,它从Index继承,其中的多级标签采用元组对象来表示。多级索引(也称层次化索引)是Pandas的重要功能,可以在Series和DataFrame对象上拥有两级和两级以上的索引。
- 将一个元组列表传递给Index()构造函数时,将自动创建MultiIndex多级索引对象。
【实例】通过Index()创建MultiIndex多级索引对象。
data1={'English':[74,85,96,74,85,96],'Math':[87,78,89,74,85,96],'Chinese':
[81,92,83,74,85,96]}
index1=pd.Index(['Math','Chinese','English'],name="course")
index_multi=pd.Index([('one','zhangsan'),('one','lisi'),("one",'wangwu'),
('two','zhangsan2'),('two','lisi2'),("two",'wangwu2')],names=
["class","name"])
df4 = pd.DataFrame(data1,columns=index1,index=index_multi)
df4
df4.index
MultiIndex(levels=[['one', 'two'], ['lisi', 'lisi2', 'wangwu', 'wangwu2', 'zhangsan', 'zhangsan2']],
labels=[[0, 0, 0, 1, 1, 1], [4, 0, 2, 5, 1, 3]],
names=['class', 'name'])
三、数据存取
Series和DataFrame对象提供了丰富的数据存取方法,除了属性和字典存取、直接使用下标和切片存取(又称为[]运算符存取)之外,还可以使用.loc[]、.iloc[]、ix[]、.at[]、iat[]等存取器存取。
3.1 属性和自带你存取
Series对象支持句点(.)索引标签类似属性的存取方法和字典存取,字典存取就是get(索引)的存取方法,返回该索引对应的值。
【实例】Series对象的属性和字典存取。
data1=[23,24,25]
index=pd.Index(['zhangsan','lisi','wangwu'],name="name")
ser=pd.Series(data=data1,index=index)
ser.zhangsan
ser.get('zhangsan')
23
注意:DataFrame的属性的存取和字典的存取是针对列索引的,返回值是该列索引对应的Series对象。
【实例】DataFrame对象的属性和字典存取。
data2=[{'Chinese':81,'English':74,'Math':87},{'Chinese':92,'English':85,
'Math':78},{'Chinese':83,'English':96,'Math':89}]
df = pd.DataFrame(data2,index=index)
df.Math
df.get('Math')
name
zhangsan 87
lisi 78
wangwu 89
Name: Math, dtype: int64
3.2 [ ]运算符存取
3.2.1 Series对象的存取
Series对象提供了丰富的下标和切片存取方法,通过[]运算符对Series对象进行存取时,支持下面这6种下标对象。
- 单个标签:获取标签对应的数值。
- 标签列表:获取标签列表中多个标签对应的行构成的Series对象。
- 标签切片:获取切片中多个标签对应的行构成的Series对象,标签切片包含终值。
- 整数下标:获取整数下标对应的数值。
- 整数下标切片:获取切片中对应的多行构成的Series对象,整数下标切片不包含终值。
- 布尔数组:获取布尔数组中为True的对应的行构成的Series对象。
data1=[23,24,25]
index=pd.Index(['zhangsan','lisi','wangwu'],name="name")
ser=pd.Series(data=data1,index=index)
#单个标签
ser['zhangsan']
23
#标签切片
ser["zhangsan":"wangwu"]
name
zhangsan 23
lisi 24
wangwu 25
dtype: int64
#标签列表
ser[["zhangsan","wangwu"]]
name
zhangsan 23
wangwu 25
dtype: int64
#单个整数下标
serp[0]
23
#整数下标列表
ser[[0,1]]
name
zhangsan 23
lisi 24
dtype: int64
#整数下标切片
#最右边取不到
ser[0:2]
name
zhangsan 23
lisi 24
dtype: int64
#布尔数组
ser[[True,False,False]]
name
zhangsan 23
dtype: int64
3.2.2 DataFrame对象的存取
与Series对象类似,通过[]运算符也可以对DataFrame对象进行存取。DataFrame对象既有行索引也有列索引,但是对DataFrame对象通过[]运算符进行存取时,主要是针对列索引进行操作,支持下面几种下标对象。
- 单个标签:获取标签对应的列,返回Series对象。
- 标签列表:获取标签列表中多个标签对应的列构成的DataFrame对象。
- 整数下标切片:获取切片中对应的多行构成的DataFrame对象,整数下标切片不包含终值。
- 标签切片:获取切片中对应的多行构成的DataFrame对象,标签切片包含终值。
- 布尔数组:获取布尔数组中为True的对应的行构成的DataFrame对象。
- 布尔DataFrame:将DataFrame对象中False对应的元素设置为NaN。
注意:布尔DataFrame对象
df>80
【实例】 删除DataFrame中的元素
del关键字可以像在字典中那样对DataFrame对象进行删除列的操作。下面用del关键字删除新添加的列C。
del df['C']
注意
⦁ 在对NumPy中的二维数组下标进行存取时,如果下标元组中只包含整数和切片,那么得到的数组和原数组共享数据,它是原数组的视图。当下标中使用整数数组索引、布尔索引及布尔数组索引等花式索引时,所获得的数组是原数组的副本,因此修改索引数组不会改变原数组。
⦁ DataFrame对象与NumPy中的二维数组一样,当下标中只包含标签和切片时,得到的DataFrame对象和原DataFrame对象共享数据,它是原DataFrame对象的视图;当下标为布尔数组、布尔DataFrame对象时,得到的DataFrame对象是原DataFrame对象的副本,因此修改新的DataFrame对象数据不影响原DataFrame对象。
3.3 存取器存取
3.4 多级索引存取
3.5 逻辑条件存取
四、Pandas字符串操作
Python的字符串和文本操作是非常便利的,字符串对象的函数使得大部分的文本操作非常简单,对于更为复杂的模式匹配和文本操作,我们可以借助正则表达式来完成。除此之外,Pandas允许将字符串和正则表达式应用到整个数组上,而且还能处理数据缺失带来的困扰。
4.1 字符串对象函数
4.1.1 类型判断
(一) is*()函数
- isalnum():是否全是字母或数字,并至少有一个字符,如果是则返回True,否则返回False。
- isalpha():是否全是字母,并至少有一个字符,如果是则返回True,否则返回False。
- isdigit():是否全是数字,并至少有一个字符,如果是则返回True,否则返回False。
- islower():字符串中字母是否全是小写,如果是则返回True,否则返回False。
- isupper():字符串中字母是否全是大写,如果是则返回True,否则返回False。
- isspace():是否全是空白字符,如果是则返回True,否则返回False。
- istitle():判断字符串是否每个单词都有且只有第一个字母是大写,如果是则返回True,否则返回False。
(二) *with()函数
with()函数可以接受start和end参数,灵活使用with()函数的start和end参数可以提高检索的速度。
- startswith(prefix[,start[,end]]):用于检查字符串是否以指定子字符串prefix开头,如果是则返回 True,否则返回False。如果参数start和end指定了值,则在指定范围内检查。
- endswith(suffix[,start[,end]]):用于判断字符串是否以指定后缀suffix结尾,如果以指定后缀结尾则返回True,否则返回False。可选参数start与end为检索字符串的开始与结束位置。
'Tomand Jerry are friend'.startswith('and',3)
True
4.1.2 查找和替换
常用函数如下
count(sub[,start[,end]]) | 统计字符串里某个字符sub出现的次数。可选参数start和end为在字符串搜索的开始与结束位置。这个函数的返回值在replace方法中经常使用。 |
find(sub[,start[,end]]) | 检测字符串中是否包含子字符串sub。如果指定start和end的范围,则检查是否包含在指定范围内,如果包含子字符串则返回开始的索引值,否则返回-1。 |
index(sub[,start[,end]]) | 与find()函数一样,只不过如果sub不在字符串中会抛出ValueError异常。 |
rfind(sub[,start[,end]]) | 类似find()函数,不过是从右边开始查找。 |
rindex(sub[,start[,end]]) | 类似index()函数,不过是从右边开始查找。 |
replace(old,new[,count]) | 用来替换字符串的某些子串,用new替换old。如果指定count参数,则最多替换count次,如果不指定,就全部替换。 |
注意:count()、find()、index()、rfind()、rindex() 5个函数都可以接受start和end参数,灵活运用可以提高检索速度。对于查找某个字符串中是否有子串,不推荐使用index()、rindex()和find()、rfind()函数,推荐使用in和not in操作。
4.1.3 分割与连接
数据分析的数据来源是多样的,可能是从网络上抓取的数据,或文本文件中获取的数据,这些数据可能是我们想要的数据组合,这时就需要进行字符串的分割与连接。字符串的分割与连接操作在字符串的处理中使用较为频繁。
常用函数如下
partition(sep) | 用来根据指定的分隔符sep将字符串进行分割。如果字符串包含指定的分隔符,则返回一个三元的元组,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。如果sep没有出现在字符串中,则返回值为(原字符串,’ ‘,’ ')。partition()函数是在Python 2.5版本中新增的。 |
rpartition(sep) | 类似partition()函数,不过是从右边开始查找。 |
splitness([keepends]) | 按照行(‘\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表。如果参数keepends为False,不包含换行符;如果为True,则保留换行符。 |
split(sep[,maxsplit]]) | 通过指定分隔符sep对字符串进行切片,返回分割后的字符串列表,如果参数maxsplit有指定值,则仅分隔maxsplit个子字符串。 |
rsplit(sep[,maxsplit]]) | 同split()函数,不过是从右边开始。 |
s.join(iterable) | 将可迭代对象(iterable)中的元素使用s连接起来。注意,iterable中必须全部是字符串类型,否则会报错。 |
4.1.4 大小切换
常用函数如下
lower() | 将字符串中所有大写字母转为小写字母。 |
upper() | 将字符串中所有小写字母转为大写字母。 |
capitalize() | 将字符串的第一个字母变成大写,其他字母变成小写。 |
swapcase() | 用于对字符串的大小写字母进行转换,大写转小写,小写转大写。 |
title() | 返回“标题化”的字符串,就是说所有单词都以大写开始,其余字母均为小写。 |
4.1.5 删除与填充
常用的删除与填充函数如下
strip([chars]) | 用于移除字符串头尾指定的字符(默认为空格),如果有多个就会删除 多个。 |
ltrip([chars]) | 用于截掉字符串左边的空格或指定字符。 |
rtrip([chars]) | 用于截掉字符串右边的空格或指定字符。 |
center(width[,fillchar]) | 返回一个原字符串居中,并使用fillchar填充至长度为width的新字符串,默认填充字符为空格。 |
ljust(width[,fillchar]) | 返回一个原字符串左对齐,并使用fillchar填充至指定长度为width的新字符串,默认填充字符为空格。如果指定的长度小于原字符串的长度,则返回原字符串。 |
rjust(width[,fillchar]) | 返回一个原字符串右对齐,并使用fillchar填充至长度为width的新字符串。如果指定的长度小于原字符串的长度,则返回原字符串。 |
zfill(width) | 返回指定长度的字符串,原字符串右对齐,前面填充0。 |
expandtabs([tabsize])把字符串中的tab符号(‘\t’)转为适当数量的空格,默认情况下转换为8个。 |
4.2 正则表达式
4.3 向量化字符串函数
Series和Index对象提供了str属性,可以满足向量化字符串操作的需求,又可以正确地处理缺失值。
data = ['peter', 'paul', None, 'mary', 'guido']
names = pd.Series(data)
#将字符串转化为大写
names.str.capitalize()
0 Peter
1 Paul
2 None
3 Mary
4 Guido
dtype: object
- Pandas提供了很多与Python字符串函数名相似的向量化字符串函数,常用的有len()、lower()、upper()、startswith()、endswith()、strip()、index()、find()、capitalize()、split()、partition()。除此之外,Pandas还增加了一些方法,表3-6所示为常用向量化字符串函数。
- 除此之外,Pandas还提供了一些根据Python标准库的re模块实现的字符串向量化函数,表3-7列出了常用的函数。
五、时间序列
六、文件读写
6.1 CSV文件读写
read_csv()函数格式如下。
Pandas.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None)
常用函数用法说明
【实例】导入多级索引CSV文件
df=pd.read_csv("student0.csv",index_col=['class','sno'])
6.2 Excel文件读写
Pandas中的read_excel()函数可以读取Excel文件中的表格型数据,格式如下。
pd.read_excel(io,sheetname=0,header=0,skiprows=None,index_col=None,names=None,arse_cols=None,date_parser=None,na_values=None,thousands=None,convert_float=True,has_index_names=None,converters=None,dtype=None,true_values=None,false_values=None,engine=None,squeeze=False,**kwds)
七、基本运算
7.1 算数运算
7.1.1 Series对象的算数运算
- 如果参与运算的两个对象,一个是Series对象,另一个是标量值,那么这个标量值会和Series对象的每个位置上的数据进行相应的运算。
#数据准备
ser1=pd.Series(np.arange(4),index=list("abcd"))
ser2=pd.Series(np.arange(5),index=list("abcde"))
ser1*2
a 0
b 2
c 4
d 6
dtype: int32
- 如果参与运算的两个对象都是Series对象,则索引自动对齐,对齐索引进行相应的算术运算;若索引没有对齐,填写NaN。
ser1*ser2
#或者
ser1.mul(ser2)
a 0.0
b 1.0
c 4.0
d 9.0
e NaN
dtype: float64
7.1.2 DataFrame对象的算数运算
- 如果参与运算的两个对象都是DataFrame对象,能够对齐的行/列索引,运算时对应行/列的位置进行相应的算术运算;不能对齐的行/列索引,填写NaN。
#数据准备
df1 = pd.DataFrame(np.arange(12).reshape((3,4)),columns=list("abcd"))
df2 = pd.DataFrame(np.arange(20).reshape((4,5)),columns=list("abcde"))
df1+df2
- Pandas提供的add()、sub()、mul()、div()、mod()等函数可以通过axis、level和fill_value等参数控制其运算行为。
aris | 指定运算对应的轴 |
---|---|
level | 指定运算对应的索引级别 |
fill_value | 指定对于不存在或者NaN的默认填充值 |
【实例】
df1.add(df2,fill_value=0)
7.1.3 Series和DataFrame的运算
- 如果参与运算的两个对象,一个是DataFrame对象,另一个是Series对象,那么Pandas会对Series对象沿行方向广播,然后做相应的运算。
- 使用axis参数可以进行列方向的运算。如果参与运算的两个对象一个是DataFrame对象,另一个是Series对象,先将Series对象沿列方向广播,然后做相应的运算。
df1+ser1
ser3=pd.Series(np.arange(4))
df2.add(ser3,axis=0)
7.2 排序和排名
7.2.1 Series对象排序
可以根据Series对象的索引和值进行排序。Pandas提供了sort_index()函数帮助我们完成Series对象按照索引排序,它返回一个已排序的新对象;sort_values()函数帮助我们完成Series对象的值排序。sort_index()和sort_value()中有参数ascending,该参数默认为True,即升序排列,如果要降序排列,只需要设置ascending=False即可。
【实例】根据索引排序
#准备数据
ser=pd.Series(np.random.randint(60,90,5),index=list("abcde"))
#根据索引排序
ser.sort_index()
a 78
b 60
c 77
d 76
e 85
dtype: int32
7.2.2 DataFrame对象排序
- 对DataFrame对象进行排序的方法与Series对象类似,我们可以使用sort_index()按照索引排序,也可以使用sort_value()按照值进行排序。不同的是,DataFrame对象是二维的,因此必须使用by参数指定排序的关键字,如果不使用by参数进行指定,就会报错。
- 使用by参数指定关键字时,可以使用列表指定多个关键字,列表中的第一个元素为第一关键字,第二个元素为第二关键字,第一关键字相同的按照第二关键字进行排序。sort_value()默认是按照列的值进行排序的,如果希望按照指定行值进行排序,则必须设置axis=1,不然会报错(因为默认指定的是列索引,找不到这个索引所以报错,axis=1的意思是指定行索引)。
【实例】根据多个列来排序,如按照"English"降序排列,"English"同样按照"Math"降序排列
df.sort_values(by=["English","Math"],ascending=False)
7.2.3 排名
- 排名是根据Series对象的值或DataFrame对象的某几列的值进行排名,Pandas中的rank()函数可以帮助我们完成排名。该函数的参数主要有ascending和method。ascending默认为True,表示升序,如果希望降序则设置ascending=False即可;method参数是说明数据相同时的排序的方法,method参数的取值及其说明如表3-16所示。
7.2.3 汇总和统计
- Pandas常用来进行大数据处理与分析,数据处理和分析的本质是数理统计,因此本小节简单介绍Pandas中常用的汇总和统计函数(见表3-17)
总结
只要是标题列出来的我都有学,不过实在太多了,不是很重要的我就没写笔记,因为时间实在是太紧了…