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

2023-10-30

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 张三 95 82 84 92
1 赵四 100 90 89 69
2 王五 88 88 78 75

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

df.loc[3] = ['马六', 65, 70, 69, 55]  # 在末尾增加一行数据
df
姓名 统计学 高数 英语 计算机
0 张三 95 82 84 92
1 赵四 100 90 89 69
2 王五 88 88 78 75
3 马六 65 70 69 55

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

df.insert(1, '运筹学', [61, 72, 84, 81]) # 在第 1 列后面插入新的一列
df
姓名 运筹学 统计学 高数 英语 计算机
0 张三 61 95 82 84 92
1 赵四 72 100 90 89 69
2 王五 84 88 88 78 75
3 马六 81 65 70 69 55
df.insert(3, 'Python', [81, 76, 74, 71]) # 在第 4 列后面插入新的一列
df
姓名 运筹学 统计学 Python 高数 英语 计算机
0 张三 61 95 81 82 84 92
1 赵四 72 100 76 90 89 69
2 王五 84 88 74 88 78 75
3 马六 81 65 71 70 69 55

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

1.3.2 删除数据

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

df.drop(3, inplace = True) # 删除第 3 行
df
姓名 运筹学 统计学 Python 高数 英语 计算机
0 张三 61 95 81 82 84 92
1 赵四 72 100 76 90 89 69
2 王五 84 88 74 88 78 75

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

df.drop('英语', inplace = True, axis = 1)
df
姓名 运筹学 统计学 Python 高数 计算机
0 张三 61 95 81 82 92
1 赵四 72 100 76 90 69
2 王五 84 88 74 88 75
df.drop(['运筹学', '高数'], inplace = True, axis = 1) # 删除两行
df
姓名 统计学 Python 计算机
0 张三 95 81 92
1 赵四 100 76 69
2 王五 88 74 75

1.3.3 合并数据

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

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

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

pd.concat([df1, df2])  #  注意中括号不等丢
姓名 统计学 高数 英语
0 张三 85 82 84
1 李四 68 63 90
2 王五 90 88 78
0 马大帅 83 92 94
1 陈小虎 59 70 78

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

pd.concat([df1, df2], ignore_index = True)
姓名 统计学 高数 英语
0 张三 85 82 84
1 李四 68 63 90
2 王五 90 88 78
3 马大帅 83 92 94
4 陈小虎 59 70 78

假如有下面的数据:

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

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 张三 85 82 84 75 94
1 李四 68 63 90 78 96
2 王五 90 88 78 80 88

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

df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'outer')
姓名 统计学 高数 英语
0 张三 85 82 84
1 李四 68 63 90
2 王五 90 88 78
3 马大帅 83 92 94
4 陈小虎 59 70 78

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

df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'inner')  # 内连接时两个数据表匹配字段的交集为空
姓名 统计学 高数 英语
df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'left')  # 左连接时保留左数据表的所有匹配字段
姓名 统计学 高数 英语
0 张三 85 82 84
1 李四 68 63 90
2 王五 90 88 78
df1.merge(df2, on = ['姓名', '统计学', '高数', '英语'], how = 'right')  # 右连接时保留右数据表的所有匹配字段
姓名 统计学 高数 英语
0 马大帅 83 92 94
1 陈小虎 59 70 78

在合并数据表时,若某些字段没有对应数据,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
3 NaN 陈小虎 NaN NaN 59.0
df1.merge(df2, on = '姓名', how = 'left')
班级 姓名 性别 籍贯 统计学
0 一班 张三 北京 85.0
1 二班 李四 上海 NaN
2 一班 王五 重庆 NaN
df1.merge(df2, on = '姓名', how = 'right')
班级 姓名 性别 籍贯 统计学
0 一班 张三 北京 85
1 NaN 陈小虎 NaN NaN 59
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Pandas 入门-2】增加,删除与合并数据 concat, merge 的相关文章

随机推荐

  • django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but setting

    django core exceptions ImproperlyConfigured Requested setting DEFAULT INDEX TABLESPACE but settings are not configured Y
  • 微信小程序 富文本编辑器 editor

    完整微信小程序 Java后端 技术贴目录清单页面 必看 富文本编辑器 可以对图片 文字进行编辑 编辑器导出内容支持带标签的 html和纯文本的 text 编辑器内部采用 delta 格式进行存储 通过setContents接口设置内容时 解
  • React Native Hook浅析——state处理

    前言 前提知识 函数式组件在每次props state变动时 都会重新执行整个函数 重新渲染页面 在使用React的class组件时 我们可以使用state this xxx 以及生命周期 componentDidMount compone
  • 常用的免费好用的DNS有哪些?

    阿酷TONY 原创文章 关键词 免费dns 百度dns 阿里dns 114 dns Google DNS 2019 1 24 DNS Domain Name Server 域名服务器 是进行域名 domain name 和与之相对应的IP地
  • 通讯协议057——全网独有的OPC HDA知识一之接口(十二)IOPCHDA_DataCallback

    本文简单介绍OPC HDA规范的IOPCHDA DataCallback 客户端接口 接口方法 更多通信资源请登录网信智汇 wangxinzhihui com 1 HRESULT OnDataChange dwTransactionID h
  • qt应用程序界面控件刷新不及时问题

    可尝试以下方法 1 void showEvent QShowEvent event this gt setAttribute Qt WA Mapped QWidget showEvent event 2 界面控件切换前调用 show qAp
  • 隐私信息检索(PIR)

    隐私信息检索 Private Information Retrieval PIR 技术是由Chor B等提出解决保护用户查询隐私的方案 主要目的是 保证查询用户在向服务器上的数据库提交查询请求 在用户查询隐私信息不被泄漏的条件下完成查询 即
  • 数据仓库ETL技术探究

    ETL概述 在构建商业智能系统的时候 如何正确有效地将分散在各个不同数据源中的信息整合到系统中成为了整个系统成败的关键 直接影响到系统的运行效率和最终结果 ETL正是解决这一问题的有力工具 ETL是指把数据从数据源装人数据仓库的过程 即数据
  • three.js 没有投影

    按照demo physics oimo instancing html 敲的 不知道问题出现在哪儿
  • FactoryBean和BeanFactory:Spring IOC容器的两个重要角色简介

    目录 一 简介 二 BeanFactory 三 FactoryBean 四 区别 五 使用场景 总结 一 简介 在Spring框架中 IOC Inversion of Control 容器是一个核心组件 它负责管理和配置Java对象及其依赖
  • 自定义数据类型使用QVariant转换的方法

    QVariant类型的放入和取出必须是相对应的 你放入一个int就必须按int取出 不能用toString Qt不会帮你自动转换 数据核心无非就是一个 union 和一个标记类型的type 传递的是整数 123 那么它union存储整数12
  • STM32定时器的编码器接口模式

    MCU为STM32L431 通用定时器框图 编码器接口模式一共有三种 通过TIMx SMCR寄存器的SMS 3 0 位来选择 模式1计数器仅在TI1FP1的边沿根据TI2FP2的电平来判断向上 下计数 模式2计数器仅在TI2FP2的边沿根据
  • DevTools 无法加载 SourceMap:XXXX.map 的内容:HTTP 错误: 状态代码 404,net::ERR_UNKNOWN_URL_SCHEM

    写在前面 又想骂人了 百度了一圈 各种不同的网站 对于该问题的解决办法的前几句都是 确切来说也不是个问题 对我项目本身没有什么实质性的影响 但看着就是不爽 请教了一下前端的同学 这个 sourceMap 是方便调试的东西 从打包后的代码映射
  • 好看的悬疑电影,最好是高智商的

    穆赫兰道 公认史上最难懂的电影 据说40 的人从电影一开始就理解错误 还有50 的人从头到尾都不知道电影在说什么 看懂这部电影 请先熟读弗洛伊德 梦的解析 死亡幻觉 此片思维难度很大 涉及的知识一般人难以理解 第一遍据说没人看得懂 理解这部
  • OSS设置CORS规则以后还是报No ‘Access-Control-Allow-Origin‘解决方法

    在OSS控制台设置了CORS规则以后 通过JS程序去调用的时候报No Access Control Allow Origin header is present on the requested resource 可以通过下面的思路来进行下
  • Open3D 计算点云凸包

    目录 一 实现依据 二 代码实现 三 结果展示 1 原始点云 2 凸包可视化 3 凸包顶点 一 实现依据 点云的凸包是包含所有点的最小凸集 open3d实现了计算凸包的方法 compute convex hull 这个接口的实现基于Qhul
  • 数据建模中利用3σ剔除异常值进行数据清洗

    方法原理 3 准则又称为拉依达准则 它是先假设一组检测数据只含有随机误差 对其进行计算处理得到标准偏差 按一定概率确定一个区间 认为凡超过这个区间的误差 就不属于随机误差而是粗大误差 含有该误差的数据应予以剔除 在正态分布中 代表标准差 代
  • [机缘参悟-96] :软件中到处充满了人类社会的气息!

    解读操作系统有感 CPU 对于CPU内核而言 调度程序是程序 应用程序也是程序 在它眼里是一样的 公平看待的 因此某种愿意上讲 CPU内核本身就是 上天 就是 道 道德经中讲 天地不仁 以万物为刍 就是这个意思 CPU中的算术单元并不区分什
  • Android 使用Camera1实现相机预览、拍照、录像

    1 前言 本文介绍如何从零开始 在Android中实现Camera1的接入 并在文末提供Camera1Manager工具类 可以用于快速接入Camera1 Android Camera1 API虽然已经被Google废弃 但有些场景下不得不
  • 【Pandas 入门-2】增加,删除与合并数据 concat, merge

    文章目录 1 3 增加 删除与合并数据 1 3 1 增加数据 1 3 2 删除数据 1 3 3 合并数据 1 3 增加 删除与合并数据 1 3 1 增加数据 在原数据末尾增加一列时 语法为 df 新列名 某个值或某个元素个数与 DataFr