Pandas-数据组合

文章目录

  • 一. 连接数据
    • 1.简介
    • 2. 加载数据
    • 1. 添加行
      • ① 添加行-DataFrame连接
      • ② 添加行-DataFrame和Series连接
      • ③ 添加行-append函数
      • ④ 添加行-重置索引
    • 2. 添加列
      • ① 添加列-concat函数
      • ② 添加列-通过dataframe['列名'] = ['值']
      • ③ 添加列-通过dataframe['列名'] = Series对象
      • ④ 添加列-重置索引
    • 3. 合并多个数据集
      • ① 简介
      • ② 加载数据
      • ③ merge()合并
        • Ⅰ. 一对一合并
        • Ⅱ. 多对一合并
      • ④ join()合并
        • Ⅰ. 加载数据
        • Ⅱ.依据两个DataFrame的行索引
        • Ⅲ.将两个DataFrame的Symbol设置为行索引,再次join数据
        • Ⅳ.将一个DataFrame的Symbol列设置为行索引,与另一个DataFrame的Symbol列进行join

一. 连接数据

1.简介

  • 数据清理
  1. 在动手进行数据分析工作之前,需要进行数据清理工作 每个观测值成一行 每个变量成一列 每种观测单元构成一张表格
  2. 数据整理好之后,可能需要多张表格组合到一起才能进行某些问题的分析 一张表保存公司名称,另一张表保存股票价格 单个数据集也可能会分割成多个,比如时间序列数据,每个日期可能在一个单独的文件中
  • 连接介绍

组合数据的一种方法是使用“连接”(concatenation)
连接是指把某行或某列追加到数据中
数据被分成了多份可以使用连接把数据拼接起来
把计算的结果追加到现有数据集,可以使用连接

2. 加载数据

import pandas as pd
df1 = pd.read_csv('data/concat_1.csv')
df2 = pd.read_csv('data/concat_2.csv')
df3 = pd.read_csv('data/concat_3.csv')

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1. 添加行

① 添加行-DataFrame连接

  • 可以使用concat函数将上面3个DataFrame连接起来

    # 需将3个DataFrame放到同一个列表中
    row_concat = pd.concat([df1, df2,df3])
    row_concat
    

    在这里插入图片描述

  • 通过 iloc ,loc等方法取出连接后的数据的子集

    row_concat.iloc[3,]
    

    在这里插入图片描述

    row_concat.loc[3,]
    

    在这里插入图片描述

② 添加行-DataFrame和Series连接

  • 使用concat连接DataFrame和Series

    new_series = pd.Series(['n1', 'n2', 'n3', 'n4'])
    new_series
    

    在这里插入图片描述

    pd.concat([df1,new_series])
    

    在这里插入图片描述
    由于Series是列数据,concat方法默认是添加行,但是Series数据没有行索引,
    所以添加了一个新列,缺失的数据用NaN填充
    NaN是Python用于表示“缺失值”的方法

  • 如果想将[‘n1’,‘n2’,‘n3’,‘n4’]作为行连接到df1后,可以创建DataFrame并指定列名

    new_series2 = pd.DataFrame([['n1', 'n2', 'n3', 'n4']],columns=['A', 'B', 'C', 'D'])
    new_series2
    

    在这里插入图片描述

    pd.concat([df1,new_series2])
    

    在这里插入图片描述

    pd.concat([df1,new_series2],axis=1)
    

    在这里插入图片描述

③ 添加行-append函数

  • concat可以连接多个对象,如果只需要向现有DataFrame追加一个对象,可以通过append函数来实现

    df1.append(df2)
    

    在这里插入图片描述

    df1.append(new_series)
    

    在这里插入图片描述

  • 使用Python字典添加数据行
    DataFrame中append一个字典的时候,必须传入ignore_index = True

    data_dict = {'A':'n1','B':'n2','C':'n3','D':'n4'}
    df1.append(data_dict,ignore_index=True)
    

    在这里插入图片描述

④ 添加行-重置索引

  • 如果是两个或者多个DataFrame连接,可以通过ignore_index = True参数,忽略后面DataFrame的索引
    pd.concat([df1,df2,df3],ignore_index=True)
    
    在这里插入图片描述

2. 添加列

① 添加列-concat函数

使用concat函数添加列,与添加行的方法类似
需要多传一个axis参数 axis的默认值是index 按行添加,传入参数 axis = columns 即可按列添加

pd.concat([df1,df2,df3],axis = 1)

在这里插入图片描述
通过列名获取子集

col_concat = pd.concat([df1,df2,df3],axis = 1)
col_concat['A']

在这里插入图片描述

② 添加列-通过dataframe[‘列名’] = [‘值’]

向DataFrame添加一列,不需要调用函数,通过dataframe[‘列名’] = [‘值’] 即可

col_concat['new_col'] = ['n1', 'n2', 'n3', 'n4']
col_concat

在这里插入图片描述

③ 添加列-通过dataframe[‘列名’] = Series对象

通过dataframe[‘列名’] = Series对象 这种方式添加一列\

col_concat['new_col_series'] = pd.Series(['n1', 'n2', 'n3', 'n4'])
col_concat

在这里插入图片描述

④ 添加列-重置索引

pd.concat([df1,df2,df3],axis = 'columns',ignore_index=True)

在这里插入图片描述

3. 合并多个数据集

① 简介

  • 在使用concat连接数据时,涉及到了参数join(join = ‘inner’,join = ‘outer’)
  • 数据库中可以依据共有数据把两个或者多个数据表组合起来,即join操作
  • DataFrame 也可以实现类似数据库的join操作
  • Pandas可以通过pd.join命令组合数据,也可以通过pd.merge命令组合数据
  • merge更灵活,如果想依据行索引来合并DataFrame可以考虑使用join函数

② 加载数据

从数据库加载数据

import sqlite3
con = sqlite3.connect('data/chinook.db')
tracks = pd.read_sql_query("SELECT * FROM tracks", con)
tracks.head()

在这里插入图片描述
从数据库中读取表,第一个参数是表名,第二个参数是数据库连接对象

genres = pd.read_sql_query("SELECT * FROM genres",con)
genres.head()

在这里插入图片描述

③ merge()合并

Ⅰ. 一对一合并

最简单的合并只涉及两个DataFrame——把一列与另一列连接,且要连接的列不含任何重复值

  • 先从tracks中提取部分数据,使其不含重复的’GenreId’值

    tracks_subset = tracks.loc[[0,62,76,98,110,193,204,281,322,359],]
    tracks_subset
    

    在这里插入图片描述

  • 通过’GenreId’列合并数据,how参数指定连接方式

    how = ’left‘ 对应SQL中的 left outer 保留左侧表中的所有key
    how = ’right‘ 对应SQL中的 right outer 保留右侧表中的所有key
    how = ‘outer’ 对应SQL中的 full outer 保留左右两侧侧表中的所有key
    how = ‘inner’ 对应SQL中的 inner 只保留左右两侧都有的key

  • left

    genre_track = genres.merge(tracks_subset[['TrackId','GenreId','Milliseconds']],on='GenreId',how='left')
    genre_track
    

在这里插入图片描述

  • right

    genre_track = genres.merge(tracks_subset[['TrackId','GenreId','Milliseconds']],on='GenreId',how='right')
    genre_track
    

    在这里插入图片描述

Ⅱ. 多对一合并
  • 使用tracks的全部数据

    genre_track = genres.merge(tracks[['TrackId','GenreId','Milliseconds']],on='GenreId',how='left')
    genre_track
    

    在这里插入图片描述

  • 转换时间单位
    如上面结果所示,Name的值在合并后的数据中被复制了
    计算每种类型音乐的平均时长
    to_timedelta 将Milliseconds列转变为timedelta数据类型
    参数unit=‘ms’ 时间单位
    dt.floor(‘s’) dt.floor() 时间类型数据,按指定单位截断数据

    genre_time = genre_track.groupby('Name')['Milliseconds'].mean()
    pd.to_timedelta(genre_time, unit='ms').dt.floor('s').sort_values()
    

    在这里插入图片描述

  • 计算每名用户的平均消费
    从三张表中获取数据,用户表获取用户id,姓名
    发票表,获取发票id,用户id
    发票详情表,获取发票id,单价,数量

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 根据用户Id(‘CustomerId’)合并用户表和发票表,根据发票Id (‘InvoiceId’)合并发票和发票详情表

    cust_inv = cust.merge(invoice,on='CustomerId').merge(ii,on='InvoiceId')
    cust_inv.head()
    

    在这里插入图片描述

  • 计算用户每笔消费的总金额
    DataFrame的assign方法 创建新列

    total = cust_inv['Quantity']*cust_inv['UnitPrice'] 
    cust_inv = cust_inv.assign(Total=total)
    cust_inv.head()
    

    在这里插入图片描述

  • 计算每名用户的平均消费
    按照用户Id,姓名分组,分组后对总金额求和,并排序

    cols = ['CustomerId','FirstName','LastName']
    cust_inv.groupby(cols)['Total'].sum().sort_values(ascending=False).head()
    

    在这里插入图片描述

④ join()合并

使用join合并,可以是依据两个DataFrame的行索引,
或者一个DataFrame的行索引另一个DataFrame的列索引进行数据合并

Ⅰ. 加载数据
stocks_2016 = pd.read_csv('data/stocks_2016.csv')
stocks_2017 = pd.read_csv('data/stocks_2017.csv')
stocks_2018 = pd.read_csv('data/stocks_2018.csv')

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Ⅱ.依据两个DataFrame的行索引

如果合并的两个数据有相同的列名,需要通过lsuffix,和rsuffix,指定合并后的列名的后缀

stocks_2016.join(stocks_2017, lsuffix='_2016', rsuffix='_2017', how='outer')

在这里插入图片描述

Ⅲ.将两个DataFrame的Symbol设置为行索引,再次join数据
stocks_2016.set_index('Symbol').join(stocks_2018.set_index('Symbol'),lsuffix='_2016', rsuffix='_2018')

在这里插入图片描述

Ⅳ.将一个DataFrame的Symbol列设置为行索引,与另一个DataFrame的Symbol列进行join
stocks_2016.join(stocks_2018.set_index('Symbol'),lsuffix='_2016', rsuffix='_2018',on='Symbol')

在这里插入图片描述

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

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

相关文章

第四周枝节

一. reverse函数 ###在写回文题的时候有以下函数: 高精度反转: (在计算高精度时,我们输入的是从高位到低位,但在计算时从低位到高位,因此需要反转) void turn(int a[])//反转数字 {int j 0;…

软件架构设计——数据表状态切换开关—未来之窗行业应用跨平台架构

一、样式 二、样式 /*开关示例*/.东方仙盟_灵颜妙手 {position: relative;display: inline-block;width: 60px;height: 34px;border-radius: 17px; /* 添加圆角效果,使开关看起来更圆润美观 */box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); /* 添加淡淡的阴影效果&…

django --递归查询评论

表数据 树状结构 action(methods(GET, ), detailFalse) def get_info_pinglun(self, request, *args, **kwargs) -> Response:根据评论id查所有回复params wenxian_pinglun_id --> 评论id;wenxian_pinglun_id self.request.GET.get(wenxian_pinglun_id)results se…

向量叉积浅讲

线段交叉 前提条件有三个点o,a,b,如何判断b在线段oa何方向,可以使用叉积; 1、向量的叉积公式 假设 -点o的坐标是 ( o x , o y ) (o_x, o_y) (ox​,oy​) -点a的坐标是 ( a x , a y ) (a_x, a_y) (ax​,ay​) -点b的坐标是 ( b x , b y ) (b_x, b_y) (bx​,by​) …

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致,并确保团队拥有交付出色工作所需的资源。在过去几年中,由于分布式团队的需求不断增加,项目经理这一角色已迅速…

基于JAVA+SpringBoot+Vue的问卷调查系统

基于JAVASpringBootVue的问卷调查系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈喽兄…

Vue开发环境搭建上篇:安装NVM和NPM(cpnm、pnpm)

文章目录 引言I 安装NVM1.1 Windows系统安装NVM,实现Node.js多版本管理1.2 配置下载镜像1.3 NVM常用操作命令II NPM永久使用淘宝源安装 cnpm安装pnpm【推荐】see also: vscode常用插件引言 淘宝镜像:http://npm.taobao.org 和 http://registry.npm.taobao.org 已在 2022.06.3…

杨天真高情商公式: 建立能量场

在现代社会中,我们常常听到“情商高的人更容易成功”,但情商到底是什么?如何培养高情商?其实,情商并不是天生的,它是可以通过训练和调整的。著名经纪人杨天真曾提到过她的一套“高情商公式”,其…

Kimi进行学术方向选择精讲!

目录 1.文献搜索 2.辅助选题 3.选题判断 在我们之前的文章中,小编都强调了选题在文章价值中的核心作用。一篇优秀的文章背后,肯定有一个精心挑选的选题。选题的好坏直接影响着文章能够发表的期刊等级。许多宝子们却采取了相反的做法,将大量…

vue.js 组件化开发 根组件

Vue.js是一个用于构建用户界面的渐进式JavaScript框架。组件化开发是Vue.js的核心理念之一,它允许开发者将部分代码封装为可重用的组件,从而提高代码的复用性和可维护性。而根组件是Vue.js应用的最顶层组件,它包含了其他所有的组件。 下面详…

YOLO系列正传(五)YOLOv4论文精解(上):从CSPNet、SPP、PANet到CSPDarknet-53

系列文章 YOLO系列基础 YOLO系列基础合集——小白也看得懂的论文精解-CSDN博客 YOLO系列正传 YOLO系列正传(一)类别损失与MSE损失函数、交叉熵损失函数-CSDN博客 YOLO系列正传(二)YOLOv3论文精解(上)——从FPN到darknet-53-C…

Vulnhub靶场-Driftingblues 6靶机(至获取shell)

靶机安装好后,照例扫描IP 端口 目录 首页为一个图片,没有什么信息 访问robots.txt,存在一个textpattern/textpattern目录,我们访问为一个登录窗口,sqlmap无法注入 提示我们扫目录时添加.zip扩展名,所以我们…

基于springboot的汽车租赁系统丨源码+数据库+万字文档+PPT

作者简介: 作者:学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”,支持远程部署调试、运行安装。 技术框架 开发语言:Java 框架:spring…

学习,指针和FLASH

一个经典的指针交换数值函数&#xff1a; #include <stdio.h>void interchange(int *u,int *v); void interchange(int *u,int *v) {int temp;temp*v;*v*u;*utemp; }int main() {int x5,y10;printf("before swap value x:%d value y:%d\n",x,y);interchange(&…

【每日学点鸿蒙知识】组件封装通用方法、callback和await性能对比、Web组件下拉刷新、hsp包报错、WebView圆角

1、HarmonyOS 自定义的组件如何封装一些通用的属性和方法&#xff0c;例如 Java 中的继承&#xff1f; export class Animal{name:stringage:stringconstructor(name:string,age:string) {this.name namethis.age age} }export class Person extends Animal{reading:stri…

Qt父窗口处理子窗口大小变化消息installEventFilter

1.需求描述 父窗口从上到下时标题栏&#xff0c;播放窗口和工具栏&#xff0c;希望监测中间播放窗口的大小变化&#xff0c;来根据分辨率自动调整播放画面的宽高&#xff1b;因为工具栏和标题栏可以隐藏&#xff0c;所以父窗口大小不变&#xff0c;中间的播放窗口也会随着工具…

策略模式以及优化

使用场景 在一个条件语句中又包含了多个条件语句 具体策略类会过多 把抽象策略和具体策略放在一个枚举类里。 方法 exe() 相当于抽象策略&#xff0c;而A和B就相当于实现了抽象策略的具体策略 这样就只需要一个枚举类就可以解决具体策略类过多的问题 public enum Strategy {A{O…

17_HTML5 Web 存储 --[HTML5 API 学习之旅]

HTML5 Web 存储&#xff08;Web Storage&#xff09;是 HTML5 引入的一种在用户浏览器中存储数据的机制。它提供了比传统的 cookies 更加方便和强大的功能&#xff0c;包括更大的存储空间、更好的性能以及更简单的 API。Web 存储主要分为两种类型&#xff1a;localStorage 和 s…

Java处理视频思路

1.首先实现断点续传功能。 断点续传实现思路&#xff1a; 前端对文件分块。前端使用多线程一块一块上传&#xff0c;上传前给服务端发一个消息校验该分块是否上传&#xff0c;如果已上传则不再上传。如果从该断点处断网了&#xff0c;下次上传时&#xff0c;前面的分块已经存在…

RealityCapture导入视频序列失败

问题原因&#xff1a;如果导入的视频文件存在多余的元数据&#xff0c;那么在这里会发生导入失败。 以本人华为手机拍摄的一段.mp4视频为例&#xff1a; 利用ffmpeg在窗口命令行中检查你的视频—— ffmpeg -i your_video_name.mp4your_video_name是你的视频文件名 如下图所示&…