Pandas库主要针对Series和DataFrame两种数据结构进行操作,一般与Numpy同时导入:
一、Series
1、Series的定义与使用
Series 是一个带有名称和索引(显性)的一维数组
Series 中包含的数据类型可以是整数、浮点、字符串、列表、元组、ndarray等
创建方式:pd.Series(['data=None', 'index=None', 'dtype=None', 'name=None'],)
从上面显示的dtype可以看出,和ndarray一样,Series中只能保存一种数据类型,如果数据类型不一致的话,也会自动转化为一致,转化的规则和ndarray类似:
注:如果在Pandas对象中dtype被标记为“object”,大概率是字符串,以及非数值型的数据类型
2、Series索引标签及添加
方法一:在创建Series对象的时候添加
定义之后就可以查看Series的索引标签:
方法二:建立好Series之后,用一个新的列表(或者其他有序序列)赋值到该Series的索引对象Index中
3、Series的名字及添加
方法一:在创建Series对象的时候添加
方法二:建立好Series之后,通过改变Series实例属性的方式来添加
4、Series索引名字的添加
通过index.name属性添加
5、Pandas的Index对象
综上所述,一个Series包括了data,index 以及 name,但是按照上面的方法,定义一个完整元素的 Series 的索引,需要先定义索引标签,再定义索引的名字,未免太繁琐。可以通过定义 Index 对象,再将其赋值到Series 中的 index 参数,这样可以一次性定义一个有完整元素的Series索引
6、Series的索引和切片
索引标签的添加并不会删除索引,索引依然可以使用,也可以通过索引标签进行切片:
注意:切片方法有点差异,用索引是不取末端,用索引标签取末端
7、Series的 .get() 方法
Series 和字典非常类似,我们可以将index和其标签看成是key,对应的值看成是value。两个有很多类似的操作,比如Series同样可以使用.get()方法,且如果在Series中无法找到要找的值,可以设定返回默认值:
8、Series掩码提取
Series值筛选与提取的方法和ndarray基本一致
因为Series底层封装的也ndarray数组结构,因此同样支持向量化操作,可以利用 .values 属性获得Series里的ndarry数据:
9、Series运算符和广播方法
Series支持ndarray的运算符和广播方法,包括numpy中的各种运算函数、聚合函数等
二、DataFrame
DataFrame 是一个带有索引的二维数据结构,每列可以有自己的名字,并且可以有不同的数据类型,你可以把它想象成一个 excel 表格或者数据库中的一张表,也可以将它想象成由多个Series拼接成的一个DataFrame,共用一个索引,它是最常用的 Pandas 对象
1、DataFrame的创建
pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
(1)通过二维数组转化过来
(2)通过字典转化
通过字典转化为DataFrame类型时,"键" 会作为列标签,"键"对应的"值" 会作为该列名对应的数据列
(3)通过嵌套列表转化
构建一个嵌套列表,然后再生成一个列标签columns,最后生成一个Index对象,这样,data、colunms、Index 三个对象就构成了DataFrame
同样,DataFrame也可以利用 .values 属性获得ndarry数据
同样Index操作可以作用于行列索引 index 和 columns 上:
2、数据提取
(1)根据列标签名提取
DataFrame中的列标签可以用作取每一列数据:
如果想提取多列,在列表中写多个列标签名即可:
(2)df.loc[ ]
可以用 loc[location] 的方法来进行显示索引
语法:df.loc[索引行, 索引列]
取某一列:
取某几列:
通过索引名取某些行:
通过某列的条件筛选取某些行:
取某些行某些列:
(3)df.iloc[ ]
进行隐式索引,即使用 iloc 也就是 index_loc,这种方式不看你的行列的索引标签是什么,只看数据是处于表中的一个什么位置,依据真正的行列索引值来取
取某行:
取某列:
筛选行列数据:
3、行列增删改
(1)行的增加
(2)行的修改
(3)列的增加与修改
如果该列的所有值都一样,可以通过传入一个标量,Pandas 会自动帮我们广播来填充所有的位置,也可以将一个序列赋值到新的列标签来增加新列;
列值修改也是如此,用一个新的序列数据赋值到对应的列标签中即可;
(4)行列删除
<1> df.drop()
df.drop(['labels=None', 'axis=0', 'index=None', 'columns=None', 'level=None', 'inplace=False'],)
labels:单个标签或类似列表要删除的索引或列标签
axis:{0或'index',1或'columns'},默认为0,决定从索引中删除标签(0或'索引')或列(1或'列')
index,columns:单个标签或类似列表替代指定轴(标签,轴= 1 相当于columns = labels)
level:int或level name,可选。对于MultiIndex,将从中删除标签的级别
inplace:bool,默认为False,如果为True,则执行就地操作并返回None
利用 index 和 columns 参数删除行列:
利用 labels 和 axis 参数删除行列:
注:df.drop()操作并没有删除原表记录,而是返回了一个新的DataFrame对象
删除除了某些行或列以外的数据:
<2> df.pop()
df.pop() 方法只能删除列,且一次只能传入一个列名
注:df.pop()会直接删除原表的列!谨慎操作!
4、列顺序的更改
先用列表定义行的列名顺序,再按照这个新的顺序重新赋值回原 DataFrame,并没有修改原 DataFrame
5、索引和列名的修改
在使用 DataFrame 的过程中,经常会遇到修改列名,修改索引名等情况,使用 rename 轻松可以实现,但是并不会修改原 DataFrame
修改索引名用需要在 df.rename() 中设置 index 参数
修改列名只需要设置 columns 参数
使用 df.rename() 将整个索引标签替换掉,包括行标签index,列标签columns,只需要建立一个映射字典:
该字典的 “键” 对应着 “旧索引”
该字典的 “值” 对应着 “新索引”
同样地,df.rename() 也可以通过字典映射的方法,修改DataFrame的列名:
还可以通过自定义函数转换行列名,函数的参数对应的要修改的 index 或 columns 对象整体:
6、单列数据类型转换
如果想要转换数据类型的话,可以通过 astype 来完成
Series.astype()
pd.to_numeric()
7、表合并方式
(1)pd.concat([df_01, df_02])
用法:np.concatenate([x, y], axis = 0)
(2)df.append(df):只能按axis=0轴合并,相当于按行追加
(3)pd.merge()
用法:pd.merge('left', 'right', how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, suffixes=('_x', '_y'))
how:
left:仅使用左框架中的键,类似于SQL左外连接,保留关键顺序
right:仅使用右框架中的键,类似于SQL右外连接,保留关键顺序
outer:使用来自两个帧的键的并集,类似于SQL full outer 连接,按字典顺序排序键
inner:使用两个帧的交集,类似于SQL内连接,保留左键的顺序
要根据多个列进行合并,传入一个由列名组成的列表即可:
对于重复列名的处理,可以使用 suffixes 选项进行设置:
对于连接键位于索引中,可以使用 left_index = True 或 right_index = True (或者两者都传):
对于层次化索引,需要以列表的形式指明用作合并键的多个列:
两个表均使用索引关联也可以:
8、数据保存与读取
读取数据:pd.read_csv(),pd.read_excel()
绝对路径写法:r"D:\hero_info_o.csv"
除了读取 csv 数据,还可以读取其他带有分隔符的数据,例如 txt 数据:
读取 excel 中不同的 sheet 数据,使用 sheet 参数即可:
以第一行作为索引:传入列名或者 index_col = 0
以其他列作为索引:传入列名
保存数据:df.to_csv(),df.to_excel()
保存到一个 excel 里的多个 sheet: