目录

  • 1. 拼接
  • 1.1 append
  • 1.2 concat
  • 2. 关联
  • 2.1 merge
  • 2.2 join

数据准备

# 导入相关库
import numpy as np
import pandas as pd
"""
拼接
有两个DataFrame,都存储了用户的一些信息,现在要拼接起来,组成一个DataFrame,如何实现呢?
"""
data1 = {
"name": ["Tom", "Bob"],
"age": [18, 30],
"city": ["Bei Jing ", "Shang Hai "]
}
df1 = pd.DataFrame(data=data1)
df1
Out[85]:
name age city
0 Tom 18 Bei Jing
1 Bob 30 Shang Hai
data2 = {
"name": ["Mary", "James"],
"age": [35, 18],
"city": ["Guang Zhou", "Shen Zhen"]
}
df2 = pd.DataFrame(data=data2)
df2
Out[86]:
name age city
0 Mary 35 Guang Zhou
1 James 18 Shen Zhen

 1. 拼接

  1.1 append

def append(self, other, ignore_index=False,verify_integrity=False, sort=None):

  append 是最简单的拼接两个DataFrame的方法。

df1.append(df2)
Out[87]:
name age city
0 Tom 18 Bei Jing
1 Bob 30 Shang Hai
0 Mary 35 Guang Zhou
1 James 18 Shen Zhen

可以看到,拼接后的索引默认还是原有的索引,如果想要重新生成索引的话,设置参数 ignore_index=True 即可。

df1.append(df2, ignore_index=True)
Out[88]:
name age city
0 Tom 18 Bei Jing
1 Bob 30 Shang Hai
2 Mary 35 Guang Zhou
3 James 18 Shen Zhen

  1.2 concat

  除了 append 这种方式之外,还有 concat 这种方式可以实现相同的功能。

pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
sort=None, copy=True):

 例子

objs=[df1, df2]
pd.concat(objs, ignore_index=True)
Out[89]:
name age city
0 Tom 18 Bei Jing
1 Bob 30 Shang Hai
2 Mary 35 Guang Zhou
3 James 18 Shen Zhen

如果想要区分出不同的DataFrame的数据,可以通过设置参数 keys,当然得设置参数 ignore_index=False。

pd.concat(objs, ignore_index=False, keys=["df1", "df2"])
Out[90]:
name age city
df1 0 Tom 18 Bei Jing
1 Bob 30 Shang Hai
df2 0 Mary 35 Guang Zhou
1 James 18 Shen Zhen

2. 关联

  有两个DataFrame,分别存储了用户的部分信息,现在需要将用户的这些信息关联起来,如何实现呢?

  2.1 merge

    def merge(self, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=False,
suffixes=('_x', '_y'), copy=True, indicator=False,
validate=None):

  通过 pd.merge 可以关联两个DataFrame,这里我们设置参数 on="name",表示依据 name 来作为关联键。默认how='inner',我们可以设置成outer

data1 = {
"name": ["Tom", "Bob", "Mary", "James"],
"age": [18, 30, 35, 18],
"city": ["Bei Jing ", "Shang Hai ", "Guang Zhou", "Shen Zhen"]
}
df1 = pd.DataFrame(data=data1)
df1
data2 = {"name": ["Bob", "Mary", "James", "Andy"],
"sex": ["male", "female", "male", np.nan],
"income": [8000, 8000, 4000, 6000]
}
df2 = pd.DataFrame(data=data2)
df2
pd.merge(df1,df2,on="name")
Out[91]:
name age city sex income
0 Bob 30 Shang Hai male 8000
1 Mary 35 Guang Zhou female 8000
2 James 18 Shen Zhen male 4000
#关联后发现数据变少了,只有 3 行数据,这是因为默认关联的方式是 inner,如果不想丢失任何数据,可以设置参数 how="outer"。
pd.merge(df1,df2,on="name",how="outer")
Out[92]:
name age city sex income
0 Tom 18.0 Bei Jing NaN NaN
1 Bob 30.0 Shang Hai male 8000.0
2 Mary 35.0 Guang Zhou female 8000.0
3 James 18.0 Shen Zhen male 4000.0
4 Andy NaN NaN NaN 6000.0

如果我们想保留左边所有的数据,可以设置参数 how="left";反之,如果想保留右边的所有数据,可以设置参数 how="right"

pd.merge(df1, df2, on="name", how="left")
Out[93]:
name age city sex income
0 Tom 18 Bei Jing NaN NaN
1 Bob 30 Shang Hai male 8000.0
2 Mary 35 Guang Zhou female 8000.0
3 James 18 Shen Zhen male 4000.0

有时候,两个 DataFrame 中需要关联的键的名称不一样,可以通过 left_on 和 right_on 来分别设置。

df1.rename(columns={"name": "name1"}, inplace=True)
df1
Out[94]:
name1 age city
0 Tom 18 Bei Jing
1 Bob 30 Shang Hai
2 Mary 35 Guang Zhou
3 James 18 Shen Zhen
df2.rename(columns={"name": "name2"}, inplace=True)
df2
Out[95]:
name2 sex income
0 Bob male 8000
1 Mary female 8000
2 James male 4000
3 Andy NaN 6000
pd.merge(df1, df2, left_on="name1", right_on="name2")
Out[96]:
name1 age city name2 sex income
0 Bob 30 Shang Hai Bob male 8000
1 Mary 35 Guang Zhou Mary female 8000
2 James 18 Shen Zhen James male 4000 

  有时候,两个DataFrame中都包含相同名称的字段,如何处理呢?

  我们可以设置参数 suffixes,默认 suffixes=('_x', '_y') 表示将相同名称的左边的DataFrame的字段名加上后缀 _x,右边加上后缀 _y。

df1["sex"] = "male"
df1
Out[97]:
name1 age city sex
0 Tom 18 Bei Jing male
1 Bob 30 Shang Hai male
2 Mary 35 Guang Zhou male
3 James 18 Shen Zhen male
pd.merge(df1, df2, left_on="name1", right_on="name2")
Out[98]:
name1 age city sex_x name2 sex_y income
0 Bob 30 Shang Hai male Bob male 8000
1 Mary 35 Guang Zhou male Mary female 8000
2 James 18 Shen Zhen male James male 4000
pd.merge(df1, df2, left_on="name1", right_on="name2", suffixes=("_left", "_right"))
Out[99]:
name1 age city sex_left name2 sex_right income
0 Bob 30 Shang Hai male Bob male 8000
1 Mary 35 Guang Zhou male Mary female 8000
2 James 18 Shen Zhen male James male 4000

  2.2 join

def join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False):

  除了 merge 这种方式外,还可以通过 join 这种方式实现关联。相比 merge,join 这种方式有以下几个不同:

  (1)默认参数on=None,表示关联时使用左边和右边的索引作为键,设置参数on可以指定的是关联时左边的所用到的键名

  (2)左边和右边字段名称重复时,通过设置参数 lsuffix 和 rsuffix 来解决。

df1.join(df2.set_index("name2"), on="name1", lsuffix="_left")
Out[100]:
name1 age city sex_left sex income
0 Tom 18 Bei Jing male NaN NaN
1 Bob 30 Shang Hai male male 8000.0
2 Mary 35 Guang Zhou male female 8000.0
3 James 18 Shen Zhen male male 4000.0

数据纵向合并案例代码

from pandas import concat

def data_concat(dir_name, to_file_path, drop_duplicates: bool = False):
"""
数据纵向合并
:param dir_name: 数据来源文件夹名称
:param to_file_path: 合并数据保存文件夹
:param drop_duplicates: 是否去重
:return:
"""
objs = (read_excel(f'{dir_name}/{file}') for file in os.listdir(dir_name))
merge_data = concat(objs=objs, ignore_index=True)
if drop_duplicates:
merge_data.drop_duplicates(inplace=True)
merge_data.to_excel(to_file_path, index=False) if __name__ == '__main__':
data_concat(dir_name='data1', to_file_path='merge_data.xlsx', drop_duplicates=True)

  

 

Pandas系列(十)-转换连接详解的更多相关文章

  1. ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借

    ASP.NET MVC深入浅出系列(持续更新)   一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...

  2. css大小单位px em rem的转换和详解

    css大小单位px em rem的转换和详解 PX特点1. IE无法调整那些使用px作为单位的字体大小:2. 国外的大部分网站能够调整的原因在于其使用了em或rem作为字体单位:3. Firefox能 ...

  3. SQL Server日期时间格式转换字符串详解

    本文我们主要介绍了SQL Server日期时间格式转换字符串的相关知识,并给出了大量实例对其各个参数进行对比说明,希望能够对您有所帮助. 在SQL Server数据库中,SQL Server日期时间格 ...

  4. java ssl https 连接详解 生成证书 tomcat keystone

    java ssl https 连接详解 生成证书 我们先来了解一下什么理HTTPS 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over ...

  5. sql各种连接详解

      迁移时间:2017年6月1日16:33:58 CreateTime--2016年9月14日11:19:00Author:Marydon sql各种连接详解 参考链接: http://www.jb5 ...

  6. Hexo系列(三) 常用命令详解

    Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...

  7. 转载爱哥自定义View系列--文字详解

    FontMetrics FontMetrics意为字体测量,这么一说大家是不是瞬间感受到了这玩意的重要性?那这东西有什么用呢?我们通过源码追踪进去可以看到FontMetrics其实是Paint的一个内 ...

  8. Cobaltstrike系列教程(三)-beacon详解

    0x000--前文 Cobaltstrike系列教程(一)-简介与安装 Cobaltstrike系列教程(二)-Listner与Payload生成 heatlevel 0x001-Beacon详解 1 ...

  9. Nginx知多少系列之(三)配置文件详解

    目录 1.前言 2.安装 3.配置文件详解 4.Linux下托管.NET Core项目 5.Linux下.NET Core项目负载均衡 6.Linux下.NET Core项目Nginx+Keepali ...

随机推荐

  1. centos下Django+uwsgi+nginx

    本篇章主要讲解uwsgi和nginx的作用,并利用两者对django项目进行部署 一.概述 在开发过程中,我们一般是在该项目的虚拟环境中启用django自带的web服务:python manage.p ...

  2. c/c++ 多线程 利用条件变量实现线程安全的队列

    多线程 利用条件变量实现线程安全的队列 背景:标准STL库的队列queue是线程不安全的. 利用条件变量(Condition variable)简单实现一个线程安全的队列. 代码: #include ...

  3. 用一条SQL语句显示所有可能的比赛组合

    一个叫team的表,里面只有一个字段name,一共有4 条纪录,分别是a.b.c.d,对应四个球队,现在四个球队进行比赛,用一条SQL语句显示所有可能的比赛组合. select * from team ...

  4. gitlab-server环境搭建

    1.安装GitLab的需求 操作系统 受支持的Unix衍生版 Ubuntu Debian CentOS Red Hat Enterprise Linux (使用CentOS的包和命令) Scienti ...

  5. 【笔记】Python集成开发环境——PyCharm 2018.3下载、注册、帮助文档

    [博客导航] [Python导航] 前言 使用好的开发环境将有效提高编程效率,在Python使用上我是小白,所以特意请教了从事语言处理的成同学,告知我,推荐使用Pycharm和IntelliJ. 目前 ...

  6. JavaScript数据类型之null和undeined

    null null是JavaScrpt的关键字,表示一个特殊值,常用于描述"空值".对null执行typeof运算将返回字符串"object". undefin ...

  7. 英语进阶系列-A05-英语升级练习三

    古诗背诵 要求:认真背诵和朗读,然后翻译成现代文,并绘制图像描述图中的意向,时间限制到10 minutes.另外,从中找出英文单词,并记录. 例如:慈母 = kind mother,手 = hand, ...

  8. isinstance_issubclass

    isinstance和issubclass分别是检验是不是对象是不是类的实例化,和子类是不是这个父类的子类 class A:pass class B(A):pass a = A() print(isi ...

  9. springboot use

    https://github.com/ityouknow/spring-boot-examples http://www.ityouknow.com/springboot/2017/06/26/spr ...

  10. 前端jquery 获取select多选的值

    当select设置属性multiple='multiple'时, option就可以多选了  那么我们如何获取所有被选中的option的值呢? 首先说明: $('select[name="m ...