当前位置: 首页 > news >正文

Day13_【DataFrame数据组合merge连接】【案例】

  • 概述

    • 在使用concat连接数据时,涉及到了参数join(join = 'inner',join = 'outer')

    • 数据库中可以依据共有数据把两个或者多个数据表组合起来,即join操作

    • DataFrame 也可以实现类似数据库的join操作

      • Pandas可以通过pd.join命令组合数据,

      • 也可以通过pd.merge命令组合数据

        merge更灵活,如果想依据行索引来合并DataFrame可以考虑使用join函数

  • 配置PyCharm 连接 Sqlite, 步骤类似于: PyCharm连接MySQL

import sqlite3# 1. 创建连接对象, 关联: Sqlite文件.
con = sqlite3.connect('data/chinook.db')
# 2. 读取SQL表数据, 参1: SQL语句, 参2: 连接对象
tracks = pd.read_sql_query('select * from tracks', con) 
# track: 歌曲表
# 3. 查看数据.
tracks.head()# 4. read_sql_query()函数, 从数据库中读取表, 参1: SQL语句, 参2: 连接对象.
genres = pd.read_sql_query('select * from genres', con) 
#genre:(歌曲流派)歌曲类别表
genres.head()   # 数据介绍, 列1: 风格id, 列2: 风格名(爵士乐, 金属...)

# 5. 从track表(歌曲表)提取部分数据, 使其不含重复的'GenreID'值
tracks_subset = tracks.loc[[0, 62, 76, 98, 110, 193, 204, 281, 322, 359], ]
print(tracks_subset)

# 歌曲分类表.merge(歌曲表子集的 歌曲id, 分类id, 歌曲时长)   on表示关联字段, how表示连接方式# inner 类似于SQL的 内连接, 即: 交集.
df1 = genres_df.merge(tracks_subset[["TrackId", "GenreId", "Milliseconds"]], on="GenreId", how="inner")# left 类似于SQL的 左外连接, 即: 左表的全集 + 交集.
df2 = genres_df.merge(tracks_subset[["TrackId", "GenreId", "Milliseconds"]], on="GenreId", how="left")# right 类似于SQL的 右外连接, 即: 右表的全集 + 交集.
df3 = genres_df.merge(tracks_subset[["TrackId", "GenreId", "Milliseconds"]], on="GenreId", how="right")# outer 类似于SQL的 满外连接, 即: 左表的全集 + 右表全集 + 交集.
df4 = genres_df.merge(tracks_subset[["TrackId", "GenreId", "Milliseconds"]], on="GenreId", how="outer")print(df1.head())
print(df2.head())
print(df3.head())
print(df4.head())

 如果两张表有相同的列名, 则会分别给其加上 _x, _y的后缀, 来源于: merge()函数自带参数: suffixes

  1. on 连接的字段, 如果左右两张表 连接的字段名字相同直接使用 on='关联字段名'

  2. 如果名字不同, left_on 写左表字段, right_on 写右表字段.

  3. 连接之后, 两张表中如果有相同名字的字段, 默认会加上后缀 默认值 x, _y

    suffixes:(" x", "_ y")


df5 = genres_df.merge(tracks_subset[['TrackId', 'Name', 'GenreId', 'Milliseconds']], on='GenreId', how='inner')
# 查看 df5 的列名(合并后的结果)
print("\ndf5 列名:")
print(df5.columns.tolist())
print(df5[['Name_x', 'TrackId', 'Name_y']])

【案例1】计算每种类型音乐的 平均时长

1: 将歌曲表tracks和歌曲类别表genres关联到一起

genres_track_df = genres_df.merge(tracks_df[["TrackId", "GenreId", "Milliseconds"]], on="GenreId", how="left")
print(genres_track_df.head())

2: 对关联后的结果进行分组,计算每个类型下歌曲的平均时长

avg_series = genres_track_df.groupby(["GenreId", "Name"])["Milliseconds"].mean()
print(type(avg_series))  # series
print(avg_series.head())

基于上述的数据,转换成日期格式
转换函数:pd.to_timedelta( )
格式:pd.to_timedelta(数据, unit='单位')
单位:s:秒,ms:毫秒,us:微秒,ns:纳秒

# 先将毫秒转换成秒
# dt.floor()  这里是截断意思,s表示秒,将毫秒截断为秒
rs1 = pd.to_timedelta(avg_series, unit="ms").dt.floor("s").sort_values(ascending=False)
print(rs1.head())

http://www.lryc.cn/news/625987.html

相关文章:

  • Redis(11)如何通过命令行操作Redis?
  • 反向代理实现服务器联网
  • 人工神经网络MATLAB工具箱指南
  • Selenium自动化测试入门:cookie处理
  • electron进程间通信- 渲染进程与主进程双向通信
  • 如何用给各种IDE配置R语言环境
  • UGUI源码剖析(10):总结——基于源码分析的UGUI设计原则与性能优化策略
  • Ubuntu 和麒麟系统创建新用户 webapp、配置密码、赋予 sudo 权限并禁用 root 的 SSH 登录的详细
  • Python os 模块与路径操作:从基础到实战应用
  • 《AI 与人类创造力:是替代者还是 “超级协作者”?》​
  • 读《精益数据分析》:营收(Revenue)—— 设计可持续盈利模式
  • RabbitMQ:SpringAMQP 入门案例
  • Day22 顺序表与链表的实现及应用(含字典功能与操作对比)
  • 计算机大数据毕业设计推荐:基于Spark的气候疾病传播可视化分析系统【Hadoop、python、spark】
  • QT示例 基于Subdiv2D的Voronoi图实现鼠标点击屏幕碎裂掉落特效
  • jmetergrafanainfluxdb搭建压测监控平台
  • C# NX二次开发:操作按钮控件Button和标签控件Label详解
  • CentOS上安装Docker的完整流程
  • 可以一键生成PPT的AI PPT工具(最新整理)
  • AiPPT怎么样?好用吗?
  • Lecture 12: Concurrency 5
  • 大数据毕业设计选题推荐:护肤品店铺运营数据可视化分析系统详解
  • 106、【OS】【Nuttx】【周边】文档构建渲染:安装 Sphinx 扩展(下)
  • OptiTrack光学跟踪系统,提高机器人活动精度
  • 电影购票+票房预测系统 - 后端项目介绍(附源码)
  • Qt密码生成器项目开发教程 - 安全可靠的随机密码生成工具
  • SpringBoot-集成POI和EasyExecl
  • SpringAIAlibaba之基础功能和基础类源码解析(2)
  • LWIP的IP 协议栈
  • springboot--使用QQ邮箱