Pandas库——DataFrame入门
文章目录一.简介二.创建三.操作1.查看一.简介DataFrame是一个二维的表格型结构,可以视为Series的容器,规定每一列所有元素的数据类型必须相同,不同列的元素数据类型可以不同DataFrame有行索引和列索引,分别可以用index和columns进行查看库的导入:importnumpy as npimport pandas as pd二.创建利用DataFrame函数进行创建参数可以为:
一.简介
DataFrame是一个二维的表格型结构,可以视为Series的容器,规定每一列所有元素的数据类型必须相同,不同列的元素数据类型可以不同
DataFrame有行索引和列索引(或者称为行标签、列标签),分别可以用index和columns进行查看
库的导入:
import numpy as np
import pandas as pd
二.创建
DataFrame的创建有两种方法:
一是通过对其他已经存在的数据结构进行转化得到的,最简单直接的方法就是利用DataFrame(对象)函数进行转化
支持转化的数据结构包括dict、list、numpy的ndarray等等
二是读取excel、csv等文件
1.python字典型
python中的字典型是由键值对组成的,值将作为DataFrame的内容,键将作为列索引
dict={
"时间":pd.date_range("20200101",periods=7),
"新增感染人数":[1,8,4,0,0,3,2],
"治愈人数":[3,2,5,4,1,0,1],
"死亡人数":[0,0,0,1,0,1,0],
}
df=pd.DataFrame(dict)
这是一种比较常用的生成DataFrame的方法
列索引为字典的键,行索引则为从0开始,步长为1的整数序列:
要注意的是,不是所有字典都能进行转化的,要求:
①字典中的’值‘由等长的列表或数组或Series构成,否则会报错:arrays must all be same length
②更严格的说,字典中的值还可以是一个字符串,可以是一个数字,它们会被视为由n个字符串/数字组成的数组(n为其他数组的长度),换言之它们所在的列内容将是全部相同的。
将前例的字典做了一个小的改动:"死亡人数":'AB'
③字典的值中必须起码含有一个列表/数组/Series,不能全部是数字、字符串,否则会报错:ValueError: If using all scalar values, you must pass an index
很好理解,前文说过要求所有值是等长的,如果出现字符串或数字这样的标量(scalar values),则会复制n份变成数组,当全部都是标量时,它无法确定要复制几份所以报错了,换言之无法确定要生成的DataFrame行索引是怎么样的
解决办法是通过给index(行索引)赋值,帮助编译器确定要复制几份:
df=pd.DataFrame(dict,index=[1,2])
—————————————————————————————————————
也可以将嵌套字典转化为dataframe,字典的外层键将被作为列索引,内层键作为行索引:
dict={
'A':{
'a':1,
'b':2,
'c':3
},
'B':{
'd':[2,6,7],
'b':[4,5],
}
}
df=pd.DataFrame(dict)
嵌套字典不会对字典的值作出要求,空缺的部分会用Nan来补上:
—————————————————————————————————————
将字典型转化为DataFrame的另外一种方法是通过from_dict
函数,例:
df=pd.DataFrame.from_dict(dict)
但是相比之下DataFrame()函数更方便快捷
2.嵌套list/numpy的多维数组
行索引或列索引默认为整数序列:
df=pd.DataFrame([[3,4,5,'6'],[2.1,3.2,4.4,5],[0,1,2,3]])
print(df)
效果如下:
注意:
①若嵌套列表的子列表的长度不相同,空缺的部分会由Nan补上
②嵌套列表的每一个子列表被视为一行。若转化的对象是列表而不是嵌套列表,则每一个元素视为一行
3.文件读取
以读取excel文件为例:
利用函数read_excel将文件中的内容提取到DataFrame中,参数为文件的路径名
字符串前的r是防止字符串中的\
被解释为转义字符
df=pd.read_excel(r"C:\Users\93297\Desktop\豆瓣电影数据.xlsx")
三.操作
1.索引的赋值
①可以自己给索引赋值,行索引用index赋值,列索引用columns赋值
df=pd.DataFrame(np.random.rand(5,6))
df.index=pd.date_range("20000101",periods=5)
df.columns=list('ABCDEF')
print(df)
👆将一个numpy库中生成的随机数数组转化为了dataframe结构,index(行)为时间序列,columns为字母:
—————————————————————————————————————
索引应该本质上是numpy库中的数组而不是list,因为我发现索引支持df.index=df.index+1
的操作
②可以用rename函数对索引进行个别修改:
直接对index和columns赋值意味着修改所有的索引名,而使用rename函数可以实现个别索引名的修改
用法:
df=df.rename(index={原索引名:修改后的索引名},columns={原索引名:修改后的索引名})
参数由两个字典组成,每个键值对的键代表原索引名,值代表修改后的索引名
③可以用set_index函数将某一列或多列设置为索引:
例:df=df.set_index('A',drop=True)
参数drop表示将该列设置为参数后是否从数据中删除该列,默认为True
也可以将多列设置为参数:df=df.set_index(['A','B'])
④可以用reset_index函数将行索引恢复为默认值(从0开始的整数序列)
参数drop=True会删除原索引,为False则将原索引变为数据中的一列
2.查看
①head函数
参数为n代表行数,默认为5
head函数可以查看表格中的前n行
df.head(3)
②tail函数
与head相对应,查看表格的后n行
③直接用中括号
在dataframe后直接用中括号来访问元素,括号内参数若为切片则访问行,否则访问列
访问行:
df[3:10:2]
,表示3、5、7、9行
(住:因为索引都是从0开始,所以称”第一行“为第0行,下同)
当行索引并非整型时,也可以:
df['20000101':'20000104']
表示行索引20000101到20000104的四行
访问列:
中括号内为索引名或索引名组成的列表即访问列:
需要注意的是df[3]
表示索引名3的列,而不是第三行,也不是第三列!
df[['A','B']]
表示A、B列
注意要写两个中括号,里面的中括号是列表的一部分
同时访问行列:
df['A'][1:3]
和df[1:3]['A']
都表示A列第1、2行,也就是说顺序是无所谓的,若中括号内为切片则代表行,为其他则代表列
④iloc函数
iloc函数是Selection by Position的函数,根据位置来找元素,传入的参数是代表位置的整型数据(整数列表、切片、单个整数)
比如df.iloc[:2,3]
表示第0、1行的第3列,与索引无关
比如df.iloc[[2,3],4:6]
代表第2、3行的4、5列
⑤loc函数
loc函数是Selection by Label的函数,即根据标签(索引)来找元素,传入的参数为行、列的索引名(列表、切片、单个索引皆可)
比如df.loc['20000101','B']
代表行索引为日期’20000101’,列索引为’B’的元素
比如df.loc[['2000-01-01','2000-01-03'],'A':'C']
代表行索引为2000-01-01和2000-01-03的A、B、C列
注意无论是iloc还是loc都是用中括号而不是小括号的,且若只有一个参数则会被认为是访问行
⑥at、iat
at和loc用法一样,但是只能定位单个元素
iat和iloc用法一样,但是只能定位单个元素
所以其实loc和iloc包含了at和iat的功能
3.添加
①append:
利用append函数向dataframe中添加新的行:
append函数添加的对象可以为dataframe、series、dict、list等数据结构
注意事项:
- 如果添加的对象含有DataFrame中不含有的列名,则这些列被当做新的列添加!产生的空位将由Nan补上
- 参数ignore_index默认为False,若为True则生成的新DataFrame的行索引会重新分配,变为从0开始、步长为1的整数序列
- 当添加的对象为字典型和列表型时,参数ignore_index必须设为True,不然会报错(因为不知道编译器该如何设置它们的行索引)。但注意ignore_index是重新分配行索引,所以可能会改变原DataFrame的行索引,为了避免这种情况的发生可以将字典型或列表型转化为Series后再加入
- 当添加的对象为Series时,需要为Series的name赋值,Series的索引被视为列索引,name被视为行索引加入DataFrame中
- 若添加的对象为DataFrame,则相当于两个DataFrame的拼接
②insert():
append函数主要用来添加行,insert函数则用于添加列
DataFrame.insert(loc, column, value, allow_duplicates=False)
参数解释:
loc : 参数column插入的位置,如果想插入到第一例则为0,取值范围: 0 <= loc <= len(columns),其中len(columns)为Dataframe的列数
column :插入列的列索引名
value : 插入的数据,可以为数组、列表、Series或数字、字符串
allow_duplicates : 默认 False,正常情况下DataFrame不允许存在重复的列名,若将该值修改为True则允许存在
③loc:
利用loc同样可以实现在末尾添加一行的操作
例:
dict={
'M':4,
'B':2.5,
'X':4.4
}
df.loc[5]=dict
注意事项:
- 若添加对象的列名在DataFrame不存在则会被无视,这一点和append不同
- 产生的空位由Nan补上
- 本质上其实是数据的修改,但是因为行索引名不存在所以会在末尾加上一行。这也解释了为什么iloc不行而loc行的原因,同时也指出了这种方法的一个缺陷,就是若行索引名已存在则无法添加而是会修改值,与之相比append()在添加时即便已经存在相同的行索引名仍可以添加
④直接用中括号
和loc相对应的一种方法,直接在DataFrame后跟一个中括号,并且中括号内的列索引名是之前不存在的,则可以实现在末尾添加一列的操作
⑤总结:
loc和直接用中括号分别可以在末尾插入行、列,但是本质是修改数据且有缺陷(不能有相同的索引名)所以不建议使用
append()函数用于在末尾添加行,也可以实现两个DataFrame的拼接
insert()函数可以在任意位置插入列
至于在任意位置插入一行的方法目前还没发现,可以使用先分割,再末尾插入,再拼接起来的做法
4.修改
数据的修改即重新赋值,利用at、iat、loc、iloc、或者直接用中括号都可以,用赋值运算符重新赋值即实现了修改
5.删除
利用drop函数进行删除:
DataFrame=DataFrame.drop()
具体而言有两种方法:
①给出axis+labels
axis来指定要删除行还是列
axis=0代表删除行
axis=1代表删除列
具体的索引名则由参数labels来给出,可以是单个索引名或索引名组成的列表
②指定index和columns
相比上面的方法,这种方法可以同时删除行和列,即直接指定index和columns(分别代表行、列,可以是单个索引名或索引名组成的列表)
更多推荐
所有评论(0)