Pandas学习笔记


前言

2023/10/30
这是一篇关于Pandas库的学习笔记!

提示:以下是本篇文章正文内容,下面案例可供参考

一、Pandas数据结构

1.1 Series对象

  • Series是一种一维的数组型对象,它除了包含值序列外(与NumPy中的一维ndarry类型相似),还包含数据标签,后面我们称其为索引(index)。

  • Series对象不仅存储值序列,而且存储数据标签,因此每个Series对象都具有两个属性。

  1. index属性:RangeIndex索引对象,如果创建Series对象时不指定index属性,那么系统会默认生成,默认生成的索引是从0到N-1(N是数据长度)。
  2. values属性:保存元素值的ndarray数组,NumPy函数都是对此进行操作。

1.1.1创建Series对象

  1. 用列表生成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)
  1. 用字典创建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
  1. 用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个属性,分别表示数据、行索引和列索引。

  1. data属性: ndarray多维数组对象,存储DataFrame对象的值数据。
  2. index属性:RangeIndex索引对象,存储行索引,如果创建DataFrame对象时不指定index属性,那么系统会生成默认行索引,默认生成的行索引是从0到N-1(N是data的行数)。
  3. columns属性:RangeIndex索引对象,存储列索引,如果创建DataFrame对象时不指定columns属性,那么系统生成默认列索引,默认生成的列索引是从0到M-1(M是data的列数)。

1.2.1 创建DataFrame对象

  1. 调用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
  1. 用包含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
  1. 对DataFrame对象设置索引
df2=pd.DataFrame(data1,index=['zhangsan','lisi','wangwu'])

         Chinese English Math
zhangsan	81	   74	  87
lisi	    92	   85	  78
wangwu	    83	   96	  89
  1. 如果设置的列索引中的某项不在字典的键中,则该项会显示为缺失值NaN定义行索引。
df4=pd.DataFrame(data1,columns=['Math','Chinese','Eng'],index=['zhangsan','lisi','wangwu'])

在这里插入图片描述

  1. 使用字典构成的列表来创建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属性可以获得标签的名称。
  1. 创建并返回一个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)
  1. 创建一个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索引对象是只读的,因此一旦创建就无法修改其中的元素。
  1. 调用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种下标对象。
  1. 单个标签:获取标签对应的数值。
  2. 标签列表:获取标签列表中多个标签对应的行构成的Series对象。
  3. 标签切片:获取切片中多个标签对应的行构成的Series对象,标签切片包含终值。
  4. 整数下标:获取整数下标对应的数值。
  5. 整数下标切片:获取切片中对应的多行构成的Series对象,整数下标切片不包含终值。
  6. 布尔数组:获取布尔数组中为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对象通过[]运算符进行存取时,主要是针对列索引进行操作,支持下面几种下标对象。
  1. 单个标签:获取标签对应的列,返回Series对象。
  2. 标签列表:获取标签列表中多个标签对应的列构成的DataFrame对象。
  3. 整数下标切片:获取切片中对应的多行构成的DataFrame对象,整数下标切片不包含终值。
  4. 标签切片:获取切片中对应的多行构成的DataFrame对象,标签切片包含终值。
  5. 布尔数组:获取布尔数组中为True的对应的行构成的DataFrame对象。
  6. 布尔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*()函数

  1. isalnum():是否全是字母或数字,并至少有一个字符,如果是则返回True,否则返回False。
  2. isalpha():是否全是字母,并至少有一个字符,如果是则返回True,否则返回False。
  3. isdigit():是否全是数字,并至少有一个字符,如果是则返回True,否则返回False。
  4. islower():字符串中字母是否全是小写,如果是则返回True,否则返回False。
  5. isupper():字符串中字母是否全是大写,如果是则返回True,否则返回False。
  6. isspace():是否全是空白字符,如果是则返回True,否则返回False。
  7. istitle():判断字符串是否每个单词都有且只有第一个字母是大写,如果是则返回True,否则返回False。

(二) *with()函数
with()函数可以接受start和end参数,灵活使用with()函数的start和end参数可以提高检索的速度。

  1. startswith(prefix[,start[,end]]):用于检查字符串是否以指定子字符串prefix开头,如果是则返回 True,否则返回False。如果参数start和end指定了值,则在指定范围内检查。
  2. 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)

在这里插入图片描述

总结

只要是标题列出来的我都有学,不过实在太多了,不是很重要的我就没写笔记,因为时间实在是太紧了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liflysheep04

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值