pandas中DataFrame用法(python)

简介

DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。其结构图示意图,如下所示:

表格中展示了某个销售团队个人信息和绩效评级(rating)的相关数据。数据以行和列形式来表示,其中每一列表示一个属性,而每一行表示一个条目的信息。

DataFrame 的每一行数据都可以看成一个 Series 结构,只不过,DataFrame 为这些行中每个数据值增加了一个列标签。因此 DataFrame 其实是从 Series 的基础上演变而来。在数据分析任务中 DataFrame 的应用非常广泛,因为它描述数据的更为清晰、直观。
同 Series 一样,DataFrame 自带行标签索引,默认为“隐式索引”即从 0 开始依次递增,行标签与 DataFrame 中的数据项一一对应。

下面对 DataFrame 数据结构的特点做简单地总结,如下所示:

  • DataFrame 每一列的标签值允许使用不同的数据类型;
  • DataFrame 是表格型的数据结构,具有行和列;
  • DataFrame 中的每个数据值都可以被修改;
  • DataFrame 结构的行数、列数允许增加或者删除;
  • DataFrame 有两个方向的标签轴,分别是行标签和列标签;
  • DataFrame 可以对行和列执行算术运算。

创建DataFrame对象

基本语法

import pandas as pd
pd.DataFrame( data, index, columns, dtype, copy)

参数说明

参数名称

说明

data

输入的数据,可以是 ndarray,series,list,dict,标量以及一个 DataFrame。

index

行标签,如果没有传递 index 值,则默认行标签是 np.arange(n),n 代表 data 的元素个数。

columns

列标签,如果没有传递 columns 值,则默认列标签是 np.arange(n)。

dtype

dtype表示每一列的数据类型。

copy

默认为 False,表示复制数据 data。

事先说明

由于我是在jupyter notebook上写的代码,先导入库,后面写代码就不需要导入了。所以下面所有的代码,都是没有导入库。如果要copy的话,请加上下面的代码。

# 导入库

import pandas as pd
import numpy as np
import matplotlib

列表创建DataFrame对象

# 列表创建DATaFrame对象
# 单一列表

data=np.arange(5)
df=pd.DataFrame(data)
print(df)

嵌套列表创建

# 使用嵌套列表创建DataFrame对象

data=[['tom',10],['marry',20],['bill',30]]
df=pd.DataFrame(data,columns=['name','age'])
print(df)

字典嵌套列表创建

数据data字典中,键对应的值的元素长度必须相等(也就是列表长度相同)

# 字典嵌套列表创建

data={"name":["Alex","Biil","Amy"],"age":[10,20,30]}
df=pd.DataFrame(data)
print(df)

字典嵌套列表,自定义行标签

# 字典嵌套列表,自定义行标签

data={"name":["Alex","Biil","Amy"],"age":[10,20,30]}
index=["num1","num2","num3"]
df=pd.DataFrame(data,index=index)
print(df)

列表嵌套字典创建

列表嵌套字典可以作为输入数据传递给 DataFrame 构造函数。默认情况下,字典的键被用作列名。

# 列表嵌套字典创建

data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print(df)

注意:如果其中某个元素值缺失,也就是字典的 key 无法找到对应的 value,将使用 NaN 代替。

字典嵌套列表,自定义行/列标签

# 字典嵌套列表以及行,列索引表创建一个DataFrame对象

data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b'])
df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b1'])
df3 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b','c'])
print(df1)
print("-"*50)
print(df2)
print("-"*50)
print(df3)

以字典形式的Series创建

传递一个字典形式的 Series,从而创建一个 DataFrame 对象,其输出结果的行索引是所有 index 的合集。

# 以字典形式的Series创建

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)

注意:对于 one 列而言,此处虽然显示了行索引 'd',但由于没有与其对应的值,所以它的值为 NaN。

总结

创建的方法有很多种,这里只是列举几种常见常用的。很多人容易被列表和字典两种类型的嵌套的搞混,一开始我也看的非常迷茫,后来看出一点规律了。

  • 列表[]里面是一行数据,字典{}里面是一列数据。
  • 字典里的键就是DataFrame里的列标签
  • 每多一个嵌套列表就多一行数据,每多一个嵌套字典就多一列数据

列索引操作DataFrame

DataFrame 可以使用列索(columns index)引来完成数据的选取、添加和删除操作。下面依次对这些操作进行介绍。

列索引选取数据列

# 使用列索引实现数据获取

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df ['one'])

列索引添加数据

# 使用列索引添加数据

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

#使用df['列']=值,插入新的数据列
df['three']=pd.Series([10,20,30],index=['a','b','c'])
print(df)

#将已经存在的数据列做相加运算
df['four']=df['one']+df['three']
print(df)

# 使用insert方法插入新的列

info=[['Jack',18],['Helen',19],['John',17]]
df=pd.DataFrame(info,columns=['name','age'])
print(df)
print("-"*50)

#注意是column参数
#数值1代表插入到columns列表的索引位置
df.insert(1,column='score',value=[91,90,75])
print(df)
  • 使用列标签可以直接添加数据,只不过只能添加在末尾
  • 使用insert添加数据,可以指定添加在哪一列

列索引删除数据列

# 使用del和pop删除数据列

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
   'three' : pd.Series([10,20,30], index=['a','b','c'])}
df = pd.DataFrame(d)
print ("Our dataframe is:")
print(df)
print("-"*50)

#使用del删除
del df['one']
print(df)
print("-"*50)

#使用pop方法删除
df.pop('two')
print (df)

使用delpop都可以删除数据列,只不过两种使用方式有些不同,注意一下

这里建议使用pop,因为pop是DataFrame的方法,而其他添加/删除数据行/列操作都是靠DataFrame方法来完成的,所以这里也用pop方法,和其他形成统一,不容易用错

行索引操作DataFrame

标签索引选取

# 标签索引选取

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)
print("-"*50)

# 选取单个数据 
print(df.loc[["a"],["one"]])
print("-"*50)

# 选取多个数据
print(df.loc["a":"c","one":"two"])
print("*-"*50)
print(df.loc[["a","d"],["one"]])

loc只接收标签索引,前面是行标签,后面是列标签,都是传列表(但是使用:时,不要传列表,直接使用即可)。选取多个数据的切片和Series差不多

整数索引选取

# 整数索引选取

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)
print("-*-"*50)

# 选取单个数据
print (df.iloc[[1],[1]])
print("-"*50)

# 选取多个数据
print(df.iloc[1:3,0:1])
print("-"*50)
print(df.iloc[[0,2],[1]])

iloc只接收整数索引,前面表示行,后面表示列,都是从零开始计数的,都是传列表(但是使用:时,不要传列表,直接使用即可)。选取多个数据的切片和Series差不多

切片操作多行选取

# 切片选取多行

d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
   'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print(df)
print("-"*50)

#左闭右开
print(df[2:4])

添加数据行

# 使用append添加数据行,添加到末尾(这个在pandas2.0之后被移除了)
# 使用concat拼接两个DataFrame

df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
print(df)
print("-"*50)
print(df2)
print("-"*50)

#在行末追加新数据行
# df = df.append(df2)
df=pd.concat([df,df2])
print(df)

注意:在有些地方还使用append添加。然而在pandas2.0之后就被移除。我们可以使用concat来平替。

删除数据

# 使用drop方法删除行数据

df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df=pd.concat([df,df2])
print(df)
print("-"*50)

#注意此处调用了drop()方法
df = df.drop(0)
print (df)

常用属性和方法

DataFrameSeries差不多

名称

属性&方法

T

行和列转置。

axes

返回一个仅以行轴标签和列轴标签为成员的列表。

dtypes

返回每列数据的数据类型。

empty

DataFrame中没有数据或者任意坐标轴的长度为0,则返回True。

ndim

轴的数量,也指数组的维数。(都是2)

shape

返回一个元组,表示了 DataFrame 维度。

size

DataFrame中的元素数量。

values

使用 numpy 数组表示 DataFrame 中的元素值。

head()

返回前 n 行数据。

tail()

返回后 n 行数据。

shift()

将行或列移动指定的步幅长度

代码演示

# 创建

d = {'Name':pd.Series(['c语言中文网','编程帮',"百度",'360搜索','谷歌','微学苑','Bing搜索']),
   'years':pd.Series([5,6,15,28,3,19,23]),
   'Rating':pd.Series([4.23,3.24,3.98,2.56,3.20,4.6,3.8])}

# 构建DataFrame
df = pd.DataFrame(d)

# 输出DataFrame
print(df)
print("-"*50)

# 转置
print(df.T)
print("-"*50)

# axes
print(df.axes)
print("-"*50)

# dytpe
print(df.dtypes)
print("-"*50)

# empty
print(df.empty)
print("-"*50)

# ndim
print(df.ndim)
print('-'*50)

# shape
print(df.shape)
print("-"*50)

# size
print(df.size)
print("-"*50)

# values
print(df.values)
print("-"*50)

# head和tail
print(df.head(3))
print("-"*50)
print(df.tail(2))
print("-"*50)

# shift

info= pd.DataFrame({'a_data': [40, 28, 39, 32, 18], 
'b_data': [20, 37, 41, 35, 45], 
'c_data': [22, 17, 11, 25, 15]}) 

#移动幅度为3
info.shift(periods=3)
print(info)
print("-"*50)
info.shift(periods=3,axis=1,fill_value= 52)
print(info)

关于这个shift,我也没有搞明白,等啥时候我搞明白了再回来补吧

总结

具体参考C语言中文网

数据分析和可视化到这就告一段落,把这些知识大致过一遍就可以了

后面去学机器学习了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/475184.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【火猫TV】LPL春季赛前瞻:Tabe迎战LNG OMG关键一战!

北京时间3月20日,LPL春季赛今天继续进行,今天将会迎来春季赛常规赛第八周第三个比赛日,今天的两场比赛是LNG战队对阵AL战队以及OMG战队对阵BLG战队,今天的两场比赛对于LNG、AL以及OMG战队都是比较重要的,目前三支战队都…

「Nginx」Nginx配置详解

「Nginx」Nginx配置详解 参考文章1、正向代理和方向代理2、指定域名允许跨域 参考文章 1、Nginx反向代理 2、nginx配置详解 3、Nginx服务器之负载均衡策略(6种) 1、正向代理和方向代理 2、指定域名允许跨域 map $http_origin $allow_cors {default 1;…

vmare17 安装不可启动的iso镜像系统

由于要测试一个软件,要安装一个Windows11_InsiderPreview_Client_x64_zh-cn_26058.iso 于是在虚拟机里捣鼓一下。但是这个iso好像不能直接启动 这样就无法直接安装了,怎么办呢,可以先用个pe系统引导进去,再在PE系统里安装这个iso…

河北库卡机器人KR500电源模块故障,该如何处理?

库卡机器人KR500电源模块常见故障类型及维修方法 1)电源模块故障指示灯亮 故障现象:库卡机器人KR500电源模块上的故障指示灯亮起,机器人不能正常工作。 维修方法:根据故障指示灯的闪烁频率或颜色判断具体的故障类型。然后&#xf…

计算机是如何工作的?CPU、内存、操作系统...

文章目录 前言一、冯诺依曼体系(Von Neumann Architecture)二、内存和硬盘区别三、CPU四、操作系统4.1计算机系统的分层视图4.2进程和线程4.3进程控制块(PCB)4.4进程管理 五、经典面试题 前言 计算的需求在⼈类的历史中是⼴泛存在…

用 ElementPlus的日历组件如何改为中文

文章目录 问题分析 问题 直接引入日历组件后&#xff0c;都是英文&#xff0c;应该如何把头部英文改为中文 <template><el-calendar><template #date-cell"{ data }"><p :class"data.isSelected ? is-selected : ">{{ data.da…

Web and HTTP

Web and HTTP First, a review… ▪ web page consists of objects ▪ object can be HTML file, JPEG image, Java applet, audio file,… ▪ web page consists of base HTML-file which includes several referenced objects ▪ each object is addressable by a URL, e.g.,…

java面向对象进阶---学习第一课

1.static学习&#xff1a; static&#xff0c;是java修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。 注意&#xff1a;&#xff01;&#xff01;&#xff01;共享的情况&#xff0c;就是用static来修饰 类名&#xff1a;1.见名知意。2.私有化构造方法 3.方法定义…

发布 AUR 软件包 (ArchLinux)

首发日期 2024-03-09, 以下为原文内容: 理论上来说, 我们应该平等的对待每一个 GNU/Linux 发行版本. 但是, 因为窝日常使用 ArchLinux, 所以对 ArchLinux 有一些特别的优待, 比如自己做的软件优先为 ArchLinux 打包发布. 本文以软件包 librush-bin 为例, 介绍发布 AUR 软件包的…

LF-YOLO

LF-YOLO算法解读&#xff0c;针对x射线图像 1、EMF&#xff1a;网络结构的改变&#xff0c;enhanced multiscale feature(增强的多尺度特性)&#xff0c;多尺度融合模块。利用基于参数的方法和无参数的方法&#xff0c;可以同时结合X射线图像的局部和全局上下文&#xff0c;利用…

kaggle竞赛宝典 | 时间序列和时空数据大模型综述!(建议收藏!)

本文来源公众号“kaggle竞赛宝典”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;时间序列和时空数据大模型综述&#xff01; 作者&#xff1a;算法进阶 时间序列和时空数据大模型综述&#xff01; 1 前言 大型语言模型&…

short、byte 运算不能赋值给原类型问题分析

一、题目分析 该题目来源于牛客网中的一道选择题 给出如上代码&#xff0c;问你输入结果&#xff0c;但是考试时并不能看出错误原因导致踩坑 &#xff1b; 鼠标指向报错位置&#xff0c;直接给出提示了&#xff0c;两种类型四则运算都会强制转换为int之后进行运算 二、具体原…

演讲嘉宾公布 | 智能家居与会议系统专题论坛将于3月28日举办

一、智能家居与会议系统专题论坛 智能家居通过集成先进的技术和设备&#xff0c;为人们提供了更安全、舒适、高效、便捷且多彩的生活体验。智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代…

Linux系统部署SQL Server结合内网穿透实现公网访问本地数据库

文章目录 前言1. 安装sql server2. 局域网测试连接3. 安装cpolar内网穿透4. 将sqlserver映射到公网5. 公网远程连接6.固定连接公网地址7.使用固定公网地址连接 前言 简单几步实现在Linux centos环境下安装部署sql server数据库&#xff0c;并结合cpolar内网穿透工具&#xff0…

使用OpenHarmony如何定制开发一套分布式亲子早教系统

概述 本篇Codelab是基于TS扩展的声明式开发范式编程语言编写的一个分布式益智拼图游戏&#xff0c;可以两台设备同时开启一局拼图游戏&#xff0c;每次点击九宫格内的图片&#xff0c;都会同步更新两台设备的图片位置。效果图如下&#xff1a; 说明&#xff1a; 本示例涉及使用…

【Gradle】取消使用idea+Gradle创建项目时自动生成.main结尾的子module

显示效果如下图所示&#xff0c;看起来比较不爽&#xff0c;但是不影响使用 解决方案&#xff1a; 一、打开.idea/gradle.xml文件 先在gradle.xml中添加内容 <option name"resolveModulePerSourceSet" value"false" />&#xff0c;然后刷新Gradle工…

嵌入式实习难找怎么办?

今日话题&#xff0c;嵌入式实习难找怎么办&#xff1f;个人建议如果找不到实习机会&#xff0c;可以回归学习嵌入式所需的知识&#xff0c;积累项目经验或者回顾之前参与过的项目&#xff0c;将它们整理复盘。如果还有时间&#xff0c;可以再尝试找实习&#xff0c;如果找不到…

Excel第27享:基于if函数嵌套的多结果唯一性匹配

1、需求描述 如下图所示&#xff0c;现在有E列、F列、G列三列数据&#xff0c;在D列中填充“最终对应编号”&#xff0c;匹配原则是&#xff1a;E列、F列、G列三列数据中&#xff0c;哪个有数据就填充哪个数据&#xff0c;如果都没有&#xff0c;就显示空值即可。 2、解决思路…

Web Service接口测试

Web service 接口测试 一. web Service概念 Web service使用与平台和编程语言无关的方式进行通讯的一项技术, web service 是一个接口, 他描述了一组可以在网络上通过标准的XML消息传递访问的操作,它基于xml语言协议来描述要执行的操作或者要与另外一个web 服务交换数据, 一组…

常用文件怎么做成二维码?文件转二维码的制作教程

现在扫码查看或者下载文件的使用场景越来越多&#xff0c;这种方式不仅有效的提高文件的安全性&#xff0c;还有效提高了文件传输的便捷性&#xff0c;所以现在将文件转二维码是一种很流行的展现方式。那么比较常用的文件格式有pdf、excel、word、ppt等&#xff0c;这些格式的文…