大数据知识体系
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
首页
数据结构与算法
  • JVM
  • Java
  • Scala
  • Python
设计模式
  • MySQL
  • Redis
  • HDFS
  • HBase
  • ClickHouse
  • ElasticSearch
  • Iceberg
  • Hudi
  • Spark
  • Flink
  • Hive
  • Yarn
  • Zookeeper
  • Maven
  • Git
  • 数据仓库
  • 用户画像
  • 指标体系
数据治理
关于
  • JVM

    • JVM 架构
    • JVM 类加载机制
    • JVM 运行时数据区
    • JVM 垃圾回收机制
    • JVM 性能监控与调优
    • JVM 常见错误
  • Java

    • Java基础

      • Java 基础知识
      • Java 基础 - 枚举类
      • Java 基础 - 异常处理
      • Java 基础 - 泛型
      • Java 基础 - 反射
      • Java 基础 - 代理模式
      • Java 基础 - 注解
    • Java集合

    • Java并发编程

    • Java 开发规范
  • Scala

    • Scala 概述
  • Python

    • Numpy

      • 初识 Numpy
      • ndarray 的创建方式
      • NumPy 的数据类型
      • NumPy 数组计算
      • 拷贝
      • 索引和切片
      • 数学和统计方法
      • 数组形状变换
      • 通用函数
      • 排序
      • 搜索和计数
      • 线性代数
      • 伪随机数生成
      • 广播
      • 文件输入和输出
    • Pandas

      • 初识 Pandas
      • 认识 Series 和 DataFrame
      • Series 和 DataFrame 增删改查
      • Index对象增删改查
      • 普通列和行Index相互转化
      • 快速查看整体信息
      • 数值运算
      • 合并数据集
        • merge 详解
          • 函数说明
          • on 用法
          • how 用法
        • concat 详解
          • 函数说明
      • 数值统计与聚合
      • 分组聚合
      • 分类类型
      • 排序和排名
      • 时间序列
      • 文件输入与输出
      • 缺失值处理
      • 字符串处理
      • pandas sql
      • 其它
  • 语言基础
  • Python
  • Pandas
Will
2022-08-04
目录

合并数据集

import numpy as np
import pandas as pd
from pandas import Series
from pandas import DataFrame
1
2
3
4

# merge 详解

# 函数说明

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort = False)

concat 函数本质上是在所有索引上同时进行对齐合并,而如果想在任意列上对齐合并,则需要 merge 函数,其在 sql 应用很多。

  • left,right: 两个要对齐合并的 DataFrame;
  • how: 先做笛卡尔积操作,然后按照要求,保留需要的,缺失的数据填充 NaN;
    • left: 以左 DataFrame 为基准,即左侧 DataFrame 的数据全部保留(不代表完全一致、可能会存在复制),保持原序
    • right: 以右 DataFrame 为基准,保持原序
    • inner: 交,保留左右 DataFrame 在 on 上完全一致的行,保持左 DataFrame 顺序
    • outer: 并,按照字典顺序重新排序
  • on:列索引或列索引列表,如果要在 DataFrame 相同的列索引做对齐,用这个参数;
  • left_on, right_on, left_index, right_index:
    • on 对应普通的列索引或列索引列表,对齐不同列名的 DataFrame,用这俩参数;
    • index 对应要使用的 index,建议不要使用这俩参数,因为可以用 concat 方法代替。
  • sort: True or False,是否按字典序重新排序。
df1 = DataFrame([[1,2],[3,4]], index = ['a','b'],columns = ['A','B'])
df2 = DataFrame([[1,3],[4,8]], index = ['b','d'],columns = ['B','C'])
df1
1
2
3
A B
a 1 2
b 3 4
df2
1
B C
b 1 3
d 4 8

如果单纯的按照 index 对齐,不如用 concat 方法,所以一般不建议使用 left_index, right_index 。

pd.merge(left = df1, right = df2, left_on='A', right_on='B')
1
A B_x B_y C
0 1 2 1 3
# 小区别是concat对重复列没有重命名,但是重名的情况不多,而且重名了说明之前设计就不大合理。
pd.concat([df1,df2], join = 'inner',axis =1)
1
2
A B B C
b 3 4 1 3

# on 用法

设置 how = 'inner'

#对于'B'列:df1的'b'行、df2的'd'行,是相同的,其他都不同。
pd.merge(left = df1, right = df2, how = 'inner' , on =['B'])
1
2
A B C
0 3 4 8
# df1的'A'列'b'行,df2的'C'列'd'行是相同的,其他都不同。
# 其他列如果同名会进行重命名。
pd.merge(left = df1, right = df2, how = 'inner',left_on = ['A'] ,right_on = ['C'])
1
2
3
A B_x B_y C
0 3 4 1 3

# how 用法

# 保持左侧DataFrame不变,用右侧来跟它对齐,对不上的填NaN。
pd.merge(left = df1, right = df2, how = 'left', on = ['B'] )
1
2
A B C
0 1 2 NaN
1 3 4 8.0
# 保持右侧DataFrame不变,用右侧来跟它对齐,对不上的填NaN。
pd.merge(left = df1, right = df2, how = 'right', on = ['B'] )
1
2
A B C
0 NaN 1 3
1 3.0 4 8

对齐的列存在重复值

重复的也没关系,操作逻辑是一致的,完全可以假想不存在重复。

df1.loc['a','B'] =4  #改成重复
df1
1
2
A B
a 1 4
b 3 4
### 保持右侧的列都在,如果左侧对齐的列存在重复值,那么对齐上后也存在重复。
pd.merge(left = df1, right = df2, how = 'right', on = ['B'] )
1
2
A B C
0 NaN 1 3
1 1.0 4 8
2 3.0 4 8

# 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)

s1 = Series([1, 2, 3], index=['a', 'b', 'c'])
s2 = Series([4, 5, 6], index=['d', 'e', 'f'])
s3 = Series([7, 8, 9], index=['g', 'h', 'i'])
1
2
3
pd.concat([s1, s2, s3])
1
a    1
b    2
c    3
d    4
e    5
f    6
g    7
h    8
i    9
dtype: int64
pd.concat([s1, s2, s3], axis=1, sort=False)
1
0 1 2
a 1.0 NaN NaN
b 2.0 NaN NaN
c 3.0 NaN NaN
d NaN 4.0 NaN
e NaN 5.0 NaN
f NaN 6.0 NaN
g NaN NaN 7.0
h NaN NaN 8.0
i NaN NaN 9.0
上次更新: 2023/11/01, 03:11:44

← 数值运算 数值统计与聚合→

Theme by Vdoing | Copyright © 2022-2023 Will 蜀ICP备2022002285号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式