【Pandas 入门-2】增加,删除与合并数据 concat, merge

news/2025/2/14 16:48:50/

文章目录

    • 1.3 增加,删除与合并数据
      • 1.3.1 增加数据
      • 1.3.2 删除数据
      • 1.3.3 合并数据

1.3 增加,删除与合并数据

1.3.1 增加数据

在原数据末尾增加一列时,语法为 df[‘新列名'] = 某个值或某个元素个数与 DataFrame 列数相同的列表,例如:

df = pd.DataFrame({'姓名':['张三', '李四', '王五'], '统计学': [95, 100, 88], '高数': [82, 90, 88], '英语': [84, 89, 78]})
df['计算机'] = [92, 69, 75] # 增加一列计算机课程的成绩
df
姓名统计学高数英语计算机
0张三95828492
1赵四100908969
2王五88887875

在原数据末尾增加一行数据时,比较简单的方式是用 loc 函数,df.loc[行索引] = 新行值

df.loc[3] = ['马六', 65, 70, 69, 55]  # 在末尾增加一行数据
df
姓名统计学高数英语计算机
0张三95828492
1赵四100908969
2王五88887875
3马六65706955

若要在指定位置插入列,则需要用到 insert 函数。

df.insert(1, '运筹学', [61, 72, 84, 81]) # 在第 1 列后面插入新的一列
df
姓名运筹学统计学高数英语计算机
0张三6195828492
1赵四72100908969
2王五8488887875
3马六8165706955
df.insert(3, 'Python', [81, 76, 74, 71]) # 在第 4 列后面插入新的一列
df
姓名运筹学统计学Python高数英语计算机
0张三619581828492
1赵四7210076908969
2王五848874887875
3马六816571706955

若要在指定位置插入行,目前 Pandas 还没有专门的函数,一般采用concat函数合并多个 DataFrame 的方式,增加多列或多行数据也可以使用 concat函数或merge函数,具体参看后面的合并数据章节。

1.3.2 删除数据

Pandas 可以利用drop函数删除行数据或列数据。删除一行时,参数为行标签名以及inplace = True。若没有参数inplace = True,原始的 DataFrame 数据不变。

df.drop(3, inplace = True) # 删除第 3 行
df
姓名运筹学统计学Python高数英语计算机
0张三619581828492
1赵四7210076908969
2王五848874887875

删除一列时,多了一个参数axis = 1

df.drop('英语', inplace = True, axis = 1)
df
姓名运筹学统计学Python高数计算机
0张三6195818292
1赵四72100769069
2王五8488748875
df.drop(['运筹学', '高数'], inplace = True, axis = 1) # 删除两行
df
姓名统计学Python计算机
0张三958192
1赵四1007669
2王五887475

1.3.3 合并数据

Pandas 中比较常用的两个合并数据的方法是concatmerge。 当两个 DataFrame 数据表具有完全相同的列标签时,一般用concat,其他情况下多用merge

df1 = pd.DataFrame({'姓名': ['张三', '李四', '王五'], '统计学': [85, 68, 90], '高数': [82, 63, 88], '英语': [84, 90, 78]})
df1
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
df2 = pd.DataFrame({'姓名': ['马大帅', '陈小虎'], '统计学': [83, 59], '高数': [92, 70], '英语': [94, 78]})
df2
姓名统计学高数英语
0马大帅839294
1陈小虎597078

两张表具有完全相同的行名,用concat合并的代码如下:

pd.concat([df1, df2])  #  注意中括号不等丢
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
0马大帅839294
1陈小虎597078

若要合并后的 index 重新命名,可以加参数ignore_index = True,让合并后数据的 index 重新从小到大命名:

pd.concat([df1, df2], ignore_index = True)
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
3马大帅839294
4陈小虎597078

假如有下面的数据:

df3 = pd.DataFrame({'姓名': ['张三', '李四', '王五'], '会计': [75, 78, 80], '管理学': [94, 96, 88]})
df3
姓名会计管理学
0张三7594
1李四7896
2王五8088

df1 与 df3 的姓名相同,但列名不完全相同。我们想把 df3 的列添加到 df1 中,此时就要使用merge方法了,它的使用语法一般如下:

DataFrame.merge(right, how='inner', on=None)
right需要合并的另一个 DataFrame 数据
how默认为 'inner',表示内连接,取两个数据表中匹配字段的交集进行合并
'outer',表示外连接,取两个数据表中匹配字段的并集进行合并
'left',表示左连接,取左边数据表中匹配字段进行合并
'right',表示右连接,取右边数据表中匹配字段进行合并
on匹配的字段(列),可以是一个或多个

因此,对于 df1 与 df3,用merge合并时,匹配的字段(列名)为’姓名’:

df1.merge(df3, on = '姓名')
姓名统计学高数英语会计管理学
0张三8582847594
1李四6863907896
2王五9088788088

merge也能实现concat的合并效果,例如,合并 df1 与 df2:

df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'outer')
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
3马大帅839294
4陈小虎597078

在上面的代码中,匹配的字段为所有的列,连接方式为外连接,实现结果与concat相同。若连接方式为其他类型,显示效果如下:

df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'inner')  # 内连接时两个数据表匹配字段的交集为空
姓名统计学高数英语
df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'left')  # 左连接时保留左数据表的所有匹配字段
姓名统计学高数英语
0张三858284
1李四686390
2王五908878
df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'right')  # 右连接时保留右数据表的所有匹配字段
姓名统计学高数英语
0马大帅839294
1陈小虎597078

在合并数据表时,若某些字段没有对应数据,Pandas 会自动用 NaN 替代,下面的例子展示了不同连接方式的效果。

df1 = pd.DataFrame({'班级': ['一班', '二班', '一班'], '姓名': ['张三', '李四', '王五'], '性别': ['男', '男', '女'], '籍贯': ['北京', '上海', '重庆']})
df1
班级姓名性别籍贯
0一班张三北京
1二班李四上海
2一班王五重庆
df2 = pd.DataFrame({ '姓名': ['张三', '陈小虎'], '统计学': [85, 59]})
df2
姓名统计学
0张三85
1陈小虎59
df1.merge(df2, on = '姓名')
班级姓名性别籍贯统计学
0一班张三北京85
df1.merge(df2, on = '姓名', how = 'outer') # 某些字段没有对应数据,则显示为 NaN
班级姓名性别籍贯统计学
0一班张三北京85.0
1二班李四上海NaN
2一班王五重庆NaN
3NaN陈小虎NaNNaN59.0
df1.merge(df2, on = '姓名', how = 'left')
班级姓名性别籍贯统计学
0一班张三北京85.0
1二班李四上海NaN
2一班王五重庆NaN
df1.merge(df2, on = '姓名', how = 'right')
班级姓名性别籍贯统计学
0一班张三北京85
1NaN陈小虎NaNNaN59

http://www.ppmy.cn/news/1024872.html

相关文章

数据结构初阶--二叉树的链式结构

目录 一.二叉树链式结构的概念 二.二叉树链式结构的功能实现 2.1.链式二叉树的定义 2.2.链式二叉树的构建 2.3.链式二叉树的遍历 2.3.1.先序遍历 2.3.2.中序遍历 2.3.3.后序遍历 2.3.4.层序遍历 2.4.链式二叉树的求二叉树的结点数量 法一:计数法 法二&a…

MIL-STD-1553B 双通道单功能4M功能模块

双通道MIL-STD-1553B总线通讯模块 32bi,33 MHz CPCI/PCI/总线 每个通道为A、B双冗余总线 单功能可设置BC/RT/BM一种工作模式 数据传输率: 4Mbps 支持32位时标, 时标精度0.25微秒 软件可设詈应答超时: 0-32767s 大容量的数…

有没有推荐的golang的练手项目?

前言 下面是github上的golang项目,适合练手,可以自己选择一些项目去练习,整理不易,希望能多多点赞收藏一下!废话少说,我们直接进入正题>>> 先推荐几个教程性质的项目(用于新手学习、巩…

python读入和读出图像

python提供了PIL库和opencv库对图像进行读取并保存。 图像读入读出 给定一张RGB的彩色图像,PIL库将其读入: import cv2 from PIL import Image # 读入图像 image2 Image.open(cub1.jpg) print(type(image2)) image2_array np.array(image2) print(image2_array…

​LeetCode解法汇总1281. 整数的各位积和之差

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位…

PHP“牵手”京东商品详情数据获取方法,京东商品详情API接口申请指南

京东详情接口 API 是淘宝开放平台提供的一种 API 接口,它可以帮助开发者获取淘宝商品的详细信息,包括商品的标题、描述、图片等信息。在淘宝电商平台的开发中,京东详情接口 API 是非常常用的 API,因此本文将详细介绍京东详情接口 …

记录--浏览器渲染15M文本导致崩溃怎么办

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近,我刚刚完成了一个阅读器的txt文件阅读功能,但在处理大文件时,遇到了文本内容过多导致浏览器崩溃的问题。 一般情况下,没有任何样式渲染时不会出现什…

C++初阶之一篇文章教会你list(理解和使用)

list(理解和使用) 什么是list特点和优势基本操作示例用法与其他序列式容器(如 std::vector 和 std::deque)相比,std::list 显著的区别和优势成员类型 list构造函数1. default (1)2. fill (2)3.range (3)4. copy (4) li…