Pandas库——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等数据结构

注意事项:

  1. 如果添加的对象含有DataFrame中不含有的列名,则这些列被当做新的列添加!产生的空位将由Nan补上
  2. 参数ignore_index默认为False,若为True则生成的新DataFrame的行索引会重新分配,变为从0开始、步长为1的整数序列
  3. 当添加的对象为字典型和列表型时,参数ignore_index必须设为True,不然会报错(因为不知道编译器该如何设置它们的行索引)。但注意ignore_index是重新分配行索引,所以可能会改变原DataFrame的行索引,为了避免这种情况的发生可以将字典型或列表型转化为Series后再加入
  4. 当添加的对象为Series时,需要为Series的name赋值,Series的索引被视为列索引,name被视为行索引加入DataFrame中
  5. 若添加的对象为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

注意事项:

  1. 若添加对象的列名在DataFrame不存在则会被无视,这一点和append不同
  2. 产生的空位由Nan补上
  3. 本质上其实是数据的修改,但是因为行索引名不存在所以会在末尾加上一行。这也解释了为什么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(分别代表行、列,可以是单个索引名或索引名组成的列表)

  • 9
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值