[黑马程序员Pandas教程]——合并与变形

news2024/11/26 9:36:11

目录:

  1. 学习目标
  2. Dataframe合并
    1. df.append函数纵向追加合并df
    2. pd.concat函数纵向横向连接多个数据集
    3. df.merge合并指定关联列的多个数据集
    4. df.join横向合并索引值相同的多个数据集
    5. df合并小结
  3. Dataframe变形
    1. df.T行列转置
    2. df.stack()和s.unstack()变形
    3. df.melt宽变长将列名变为列值
    4. df.pivot_table透视表
  4. 总结
  5. 项目地址

1.学习目标

  • 知道df.append()、pd.concat()、df.merge()、df.join()四个合并函数的区别和用法

  • 知道df.T、df.stack()、df.unstack()、df.melt()的用法

  • 知道df.pivot_table()透视表的用法

2. Dataframe合并

很多情况需要将多个df合并为一个新的df,常用方法如下

  • df1.append(df2) 纵向合并数据集

  • pd.concat([df1,df2]) 横向或纵向合并数据集,df1和df2可以没有任何关系

  • df1.merge(df2) 融合df1和df2,要有关联的列(两个列名相同的列)

  • df1.join(df2) 横向合并,df1和df2列名相同

  • 导包并准备数据集

import pandas as pd

df1 = pd.DataFrame([[1, 2, 3], [1, 10, 20], [5, 6, 7], [3, 9, 0], [8, 0, 3]], columns=['x1', 'x2', 'x3'])
df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4'])
print(df1)
print(df2)
df.append函数纵向追加合并df
  • df.append()函数纵向连接其他df重置索引返回新的df
import pandas as pd

df1 = pd.DataFrame([[1, 2, 3], [1, 10, 20], [5, 6, 7], [3, 9, 0], [8, 0, 3]], columns=['x1', 'x2', 'x3'])
df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4'])

print(pd.concat([df1, df2]))
# 参数ignore_index默认为False 如果为 True 则重置为自增索引
print(pd.concat([df1, df2], ignore_index=True))
pd.concat函数纵向横向连接多个数据集
  • pd.concat()函数纵向连接多个数据集,N个df从上到下一个摞一个:

    • 不使用join='inner'参数,数据会堆叠在一起,列名相同的数据会合并到一列,合并后不存在的数据会用NaN填充

    • 使用join='inner'参数,只保留数据中的共有部分

  • pd.concat(axis=1)函数横向连接多个数据集,N个df从左到右一个挨着一个:

    • 匹配各自行索引,缺失值用NaN表示

    • 使用join='inner'参数,只保留索引匹配的结果

import pandas as pd

df1 = pd.DataFrame([[1, 2, 3], [1, 10, 20], [5, 6, 7], [3, 9, 0], [8, 0, 3]], columns=['x1', 'x2', 'x3'])
df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4'])

# 纵向连接,全部数据都保留
print(pd.concat([df1, df2]))
# 纵向连接,只保留共有数据
print(pd.concat([df1, df2], join='inner'))
# 横向连接,全部数据都保留
print(pd.concat([df1, df2], axis=1))
# 横向连接,保留索引值匹配的数据
print(pd.concat([df1, df2], join='inner', axis=1))
  • pd.concat()函数纵向连接多个数据集的具体使用

pd.concat([df1, df2, df3])
 df.merge合并指定关联列的多个数据集
  • merge函数能够将df1合并指定列的df2返回新的df,merge函数有2种写法
# 写法1
df1.merge(df2, on='列名', how='固定值')
# 写法2
pd.merge(df1, df2, on='列名', how='固定值')
  • merge函数有2种常用参数,参数说明如下

    • 参数on='列名',表示基于那一列进行合并操作

    • 参数how='固定值',表示合并后如何处理行索引,固定参数具体如下:

      • how='left' 对应SQL中的left join,保留左侧表df1中的所有数据

      • how='right' 对应SQL中的right join,保留右侧表df2中的所有数据

      • how='inner' 对应SQL中的inner,只保留左右两侧df1和df2都有的数据

      • how='outer' 对应SQL中的join,保留左右两侧侧表df1和df2中的所有数据

  • merge横向连接多个关联数据集具体使用

import pandas as pd

df1 = pd.DataFrame([[1, 2, 3], [1, 10, 20], [5, 6, 7], [3, 9, 0], [8, 0, 3]], columns=['x1', 'x2', 'x3'])
df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4'])

print(df1)
print(df2)
df3 = pd.merge(df1, df2, how='left', on='x1')
df4 = pd.merge(df1, df2, how='right', on='x1')
df5 = pd.merge(df1, df2, how='inner', on='x1')
df6 = pd.merge(df1, df2, how='outer', on='x1')
# 下图左1
print(df3)
# 下图右上
print(df4)
# 下图右中
print(df5)
# 下图右下
print(df6)

 

df.join横向合并索引值相同的多个数据集
  • join横向合并索引值相同的多个数据集;通过lsuffixrsuffix两个参数分别指定左表和右表的列名后缀,how参数的用法与merge函数的how参数用法一致
import pandas as pd

df1 = pd.DataFrame([[1, 2, 3], [1, 10, 20], [5, 6, 7], [3, 9, 0], [8, 0, 3]], columns=['x1', 'x2', 'x3'])
df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4'])

print(df1.join(df2, lsuffix='df1的列名后缀', rsuffix='df2的列名后缀', how='outer'))

 

 

df合并小结
  • df1.append(df2) 纵向合并数据集

  • pd.concat([df1,df2]) 横向或纵向合并数据集,df1和df2可以没有任何关系

  • df1.merge(df2) 融合df1和df2,要有关联的列(两个列名相同的列)

  • df1.join(df2) 横向合并,df1和df2索引值相同

3.Dataframe变形

很多情况需要对原数据集进行一些操作,最终导致数据集的形状发生改变(表格的长宽发生变化),这一类操作称之为df变形

  • df.T

  • stack & unstack

  • melt

  • 指定列长变宽 pd.crosstab(df.Sex, df.Handedness, margins = True)

  • 透视表pivot

    • pd.pivot_table

 

 df.T行列转置
  • 行变列,列变行
import pandas as pd

df1 = pd.DataFrame([[1, 2, 3], [1, 10, 20], [5, 6, 7], [3, 9, 0], [8, 0, 3]], columns=['x1', 'x2', 'x3'])
df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4'])

print(df1)
print(df1.T)
df.stack()和s.unstack()变形

import pandas as pd

# 构造示例数据集
df3 = pd.DataFrame([[1, 2, 3], [4, 5, 6]], columns=['store1', 'store2', 'store3'], index=['street1', 'street2'])
# 查看数据集
print(df3)
# 表格变花括号结构
s3 = df3.stack()
print(s3)
# 花括号变表格
print(s3.unstack())

 

df.melt宽变长将列名变为列值
  • pd.melt()函数,又称为数据融合函数,将指定的一个或多个列名变成一个列的值;如下图所示,可以将宽df变为长df

 

 

df.melt(
    id_vars=['列名'], # 不变形的所有列
    value_vars=['列名'], # 要变形的所有列:把多个列变成一个新列;同时所有对应的值变成第二个新列的值
    var_name='新列名', # 新列的列名
    value_name='新列名' # 第二个新列的列名
)
  • pd.melt函数具体使用

import pandas as pd

df4 = pd.read_csv('../datas/data_set/music.csv')
print(df4)

# 除了id_vars指定的列不变以外,剩余列全部都变形
print(df4.melt(
    id_vars=['artist', 'track'],
    # value_vars=['wk1', 'wk2'],
    var_name='week',
    value_name='rating'
))
# id_vars指定的列不变,value_vars指定的列都变,其他列被丢弃
print(df4.melt(
    id_vars=['artist', 'track'],
    value_vars=['wk1', 'wk2'],
    var_name='week',
    value_name='rating'
))
# value_vars指定的列都变,其他列被丢弃
print(df4.melt(
    # id_vars=['artist','track'],
    value_vars=['wk1', 'wk2'],
    var_name='week',
    value_name='rating'
))

 

df.pivot_table透视表
  • 数据透视表就是基于原数据表、按照一定规则呈现汇总数据,转换各个维度去观察数据;和excel的透视表在数据呈现上功能相同
df.pivot_table(
    index='列名1', 
    columns='列名2',
    values='列名3', 
    aggfunc='内置聚合函数名',
    margins=True # 默认是False, 如果为True,就在最后一行和最后一列,按行按列分别执行aggfunc参数规定的聚合函数
)
  • 使用说明:以列名1作为索引,根据列名2进行分组,对列名3使用pandas内置的聚合函数进行计算,返回新的df对象

  • 参数说明:

    • index:返回df的行索引,并依据其做分组;传入原始数据的列名

    • columns:返回df的列索引;传入原始数据的列名,根据该列做分组

    • values: 要做聚合操作的原始数据的列名

    • aggfunc:内置聚合函数名字符串

  • 具体使用:加载优衣库的销售数据集,统计每个城市线下门店各种品类商品总销售额

import pandas as pd

# 读取优衣库的销售数据
df4 = pd.read_csv('../datas/data_set/uniqlo.csv')
# 获取全部线下的销售数据
df5 = df4.query('channel=="线下"')
print(df5.head())
# 每个城市线下门店各种品类商品总销售额
print(df5.pivot_table(
    index='city',
    columns='product',
    values='revenue',
    aggfunc='sum',
    margins=True
))
  • 图解上述代码变化过程

 

  • 小练习:统计每个城市线上线下各种品类商品总销售额

import pandas as pd

# 读取优衣库的销售数据
df4 = pd.read_csv('../datas/data_set/uniqlo.csv')

print(df4.pivot_table(
    index=['city', 'channel'],
    columns='product',
    values='revenue',
    aggfunc='sum',
    margins=True
))

 4.总结

合并数据集

  • 纵向追加合并 df1.append(df2, ignore_index=True)

    • 参数ignore_index默认为False 如果为 True 则重置为自增索引

  • pd.concat函数纵向横向连接多个数据集

  • # 纵向连接,全部数据都保留
    pd.concat([df1, df2])
    # 纵向连接,只保留共有数据
    pd.concat([df1, df2], join='inner')
    # 横向连接,全部数据都保留
    pd.concat([df1,df2], axis=1)
    # 横向连接,保留索引值匹配的数据
    pd.concat([df1,df2], join='inner', axis=1)

    df.merge合并指定关联列的多个数据集

  • df1.merge(df2, on='列名', how='固定值')
    # 参数on='列名',表示基于那一列进行合并操作
    # 参数how='固定值',表示合并后如何处理行索引,固定参数具体如下:
    # how='left' 对应SQL中的left join,保留左侧表df1中的所有数据
    # how='right' 对应SQL中的right join,保留右侧表df2中的所有数据
    # how='inner' 对应SQL中的inner,只保留左右两侧df1和df2都有的数据
    # how='outer' 对应SQL中的join,保留左右两侧侧表df1和df2中的所有数据

    df.join横向合并索引值相同的多个数据集;通过lsuffixrsuffix两个参数分别指定左表和右表的列名后缀,how参数的用法与merge函数的how参数用法一致

  • df1.join(
        df2, 
        lsuffix='df1的列名后缀', 
        rsuffix='df2的列名后缀', 
        how='outer'
    )
  • df1.join(
        df2, 
        lsuffix='df1的列名后缀', 
        rsuffix='df2的列名后缀', 
        how='outer'
    )
  • 合并df的四个函数总结

    • df1.append(df2) 纵向合并数据集

    • pd.concat([df1,df2]) 横向或纵向合并数据集,df1和df2可以没有任何关系

    • df1.merge(df2) 融合df1和df2,要有关联的列(两个列名相同的列)

    • df1.join(df2) 横向合并,df1和df2索引值相同

 

df变形

  • df.T 行变列、列变行

  • df.stack()把df变为树状花括号形式(Seriers对象);df.unstack()是df.stack()的逆操作

  • pd.melt()函数,将指定的一个或多个列名变成新df的一个列的值,原列值变成新df的另一个列的值

  • df.melt(
        id_vars=['列名'], # 不变形的所有列
        value_vars=['列名'], # 要变形的所有列:把多个列变成一个新列;同时所有对应的值变成第二个新列的值
        var_name='新列名', # 新列的列名
        value_name='新列名' # 第二个新列的列名
    )

    df.pivot_table透视表:按照一定规则提取并展示汇总数据,方便我们转换各个维度去观察数据

  • # 以列名1作为索引
    # 根据列名2进行分组
    # 对列名3使用pandas内置的聚合函数进行计算
    # 返回新的df对象
    df.pivot_table(
        index='列名1', 
        columns='列名2',
        values='列名3', 
        aggfunc='内置聚合函数名',
        margins=True # 默认是False, 如果为True,就在最后一行和最后一列,按行按列分别执行aggfunc参数规定的聚合函数
    )
    # index:返回df的行索引,并依据其做分组;传入原始数据的列名
    # columns:返回df的列索引;传入原始数据的列名,根据该列做分组
    # values:  要做聚合操作的原始数据的列名
    # aggfunc:内置聚合函数名字

5.项目地址

Python: 66666666666666 - Gitee.com

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业该怎么选择泛域名https证书

随着互联网技术的不断进步,网络安全技术也在不断发展,https数字证书技术也在不断进步。现在,为了迎合市场需求,CA认证机构开发了多种类型的https数字证书,而泛域名https证书可以有效地保护多个网站客户的个人隐私和信息…

通信原理板块——图像压缩编码

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、图像压缩编码 图像压缩编码可以…

增强group by的使用

-- (1) 显示某种岗位的雇员总数、平均工资 SELECT COUNT(empno),FORMAT(AVG(sal),2) AS avg_sal,jobFROM empGROUP BY job; -- (2) 显示雇员总数,以及获得补助的雇员数 SELECT COUNT(*) AS emp_total,COUNT(comm) AS emonyFROM emp;-- (3) 统计获得补助的非空补助的…

中国人民大学与加拿大女王大学金融硕士——在金融领域里持续探索、成长

在金融领域里持续探索、成长,这是一个永无止境的旅程。在这个领域里,机遇与挑战并存,未知与已知交织,需要我们时刻保持敏锐的洞察力和扎实的基本功。金融市场的变化日新月异,我们需要时刻关注市场动态,了解…

腾讯待办是不是停了?怎么用其它提醒软件查看导出的ics文件

腾讯待办是腾讯企业旗下的业务产品,其主要以微信小程序的形式使用,定位于待办事项和日程管理工具,支持罗列日程待办清单、设定定时提醒,帮助大家规划日常事务和进行时间管理,成功创建待办事项后可在对应的公众号和绑定…

餐品展示订餐小程序的作用是什么

对有门店的餐饮商家来说,只要味道能说的过去,能够满足时间、空间需求,那么订餐就会很平常,对中型或酒店等单位更是趋于平常,同时还有订桌、菜品预约、咨询等需求,那么对餐饮商家来说,基于餐品展…

互联网常见职称

1、管理层 CEO – Chief Executive Officer 首席执行官 VP – Vice President 副总裁 HRD – Humen Resource Director 人力资源总监 OD – Operations Director 运营总监 MD – Marketing Director 市场总监 GM – General Manager 总经理 PM – Production Manager 产品…

新能源产业微电网保护及安全自动装置解读

安科瑞 崔丽洁 摘 要:在“碳达峰”、“碳中和”的双碳背景下,为了避免化石能源的直接燃烧导致气候变化,新能源将作为新型电力系统供电的主体。为了保证新型电力系统的可靠运行,配置微机保护装置和电能质量在线监测装置有效监测电…

Flat Ads凭全球6亿独家流量,入选《中国数字营销生态图2023版》名单

近日,中国商务广告协会数字营销专业委员会、虎啸奖组委会、秒针营销科学院共同发布了《中国数字营销生态图(2023版)》的入选名单。该图谱一共包含三大类19个大赛道,109个细分赛道,收录了千余家数字营销优质服务商、媒体…

管理视频推广工作:新媒体团队的成功策略

目前的新媒体团队,在视频管理时呈现出多、杂、散的特点,如何有效管理视频素材是当下许多新媒体团队的管理痛点,也是管理要点。高效的视频推广管理是新媒体团队提升产出效率的关键。 那么新媒体行业该如何管理视频推广工作? 数据…

[SUCTF 2019]CheckIn1

提示 一句话木马的多种变式(这里需要用到用javascript来写一句话木马)注意修改文件头 先随意上传一个文件fuzz一下看能不能直接传webshell 从下面来看常见php后缀都不行,其中有一个没有加后缀过了后缀验证这一步,到了下一步,但是他还会看文件…

Java关于由子类构造器生成的父类对象的反射问题

Java关于由子类构造器生成的父类对象的反射问题 问题概括一、案例准备二、问题描述 问题概括 提示:这里我就不绕圈子直接描述: Java中由子类构造器生成的父类的getclass.getName不是父类的类名而是子类的类名,因此不可以用子类构造器生成的…

环形链表I和II

环形链表I 题目描述 给你一个链表的头节点 head ,判断链表中是否有环。如果链表中存在环,则返回true。否则,返回false 。 解题思路 采用快慢指针的思想,创建fast和slow一快一慢指针,slow一次走一步,fas…

Flutter StreamBuilder 实现局部刷新 Widget

Stream 就是事件流或者管道,是基于事件流驱动设计代码,然后监听订阅事件,并针对事件变换处理响应。 Stream 分单订阅流和广播流,单订阅流在发送完成事件之前只允许设置一个监听器,并且只有在流上设置监听器后才开始产生事件&…

antd Form 校验自定义复杂判断-validator

antd Form 校验 加入自定义复杂逻辑 <Form.Itemlabel"编码"name"code"rules{[{required: true,validator: (_rule, value) > {if (value ) {return Promise.reject(请输入编码);}return IsExist(value).then((res) > {if (res?.statusCode 20…

【Git系列】Github指令搜索

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Leetcode-142 环形链表 II

哈希表 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode&…

[OS]11.9.2023 中断

中断向量表 CPU的设计者必须在中断信息和其处理程序的入口地址之间建立某种联系&#xff0c;使得CPU根据中断信息可以找到要执行的处理程序。 中断信息中包含有标识中断源的类型码。根据CPU的设计&#xff0c;中断类型码的作用就是用来定位中断处理程序。 比如CPU 根据中断类型…

在PostgreSQL中创建和管理数据库

PostgreSQL是一个强大、开源的关系型数据库管理系统&#xff0c;它提供了丰富的功能和灵活的配置选项&#xff0c;使得它成为许多开发者和组织的首选数据库之一&#xff0c;接下来我会介绍如何在PostgreSQL中创建和管理数据库。 一、安装和配置PostgreSQL 第一步&#xff0c;…

ViewPager2 使用

一、什么是ViewPager&#xff1f; 布局管理器允许左右翻转带数据的页面&#xff0c;你想要显示的视图可以通过实现PagerAdapter来显示。这个类其实是在早期设计和开发的&#xff0c;它的API在后面的更新之中可能会被改变&#xff0c;当它们在新版本之中编译的时候可能还会改变…