Pandas_04合并数据集

一、合并数据集

1、pandas.merge :根据一个或多个键将不同DataFrame中的行连接起来。
2、pandas.concat: 可以沿着一条轴将多个对象堆叠到一起
3、实例方法conbine_first: 将重复数据编结到一起,用一个对象中的值填充另外一个对象的缺失值。

二、pandas.merge:数据库风格的DataFrame合并

数据准备:

import pandas as pd
import os

os.chdir('E:\学习文档\data')
os.getcwd()

student_data = pd.read_excel('Test_score.xlsx',sheet_name ='Sheet1')
student_data

Pandas_04合并数据集_第1张图片

score_data = pd.read_excel('Test_score.xlsx',sheet_name ='Sheet2')
score_data

Pandas_04合并数据集_第2张图片

  • pd.merge各项参数说明
'''
pd.merge(left, 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)

常用参数说明
left:参与合并的左侧的DataFrame
right:参与合并的右侧的DataFrame
how : {'left', 'right', 'outer', 'inner'}, 默认 'inner'
      left:左外联接,以左侧的DataFrame数据为基准,右侧的DataFrame的数据能关联的关联,不能关联的摒弃
      right:右外联接,以右侧的DataFrame数据为基准,左侧的DataFrame的数据能关联的关联,不能关联的摒弃
      outer:全连接,取两个DataFrame的并集
      inner:内连接,取两个DataFrame的交集
on:用于连接的列名,在左右两个DataFrame同时存在
left_on:左键,左侧DataFrame要进行关联的键
right_on :右键,右侧DataFrame要进行关联的键
left_index:使用左侧DataFrame中的索引作为连接键。
right_index:使用右侧DataFrame中的索引作为连接键。
sort:合并后的数据进行排序,默认为True,处理大数据集时可禁用以获得更好的性能。
suffixes:字符串值元组,用于追加到重叠列名的末尾,
          如果左右两个DataFrame都有同一个值Data,合并后将会出现Data_x,Data_y
'''
  • 内连接 inner
# 内连接
pd.merge(student_data,score_data,on='id')

取交集。由于左右两个DataFrame都有同一个值name,所以合并后会加以区分
Pandas_04合并数据集_第3张图片

  • 左外连接 left
# 左连接
pd.merge(student_data,score_data,on='id',how ='left')

右侧的DataFrame没有 id为5、6、7、8的数据,所以name_y、score为空值。
Pandas_04合并数据集_第4张图片

  • 右外连接 right
# 右连接
pd.merge(student_data,score_data,on='id',how ='right')

左侧的DataFrame没有 id为9、10的数据,所以name_x、gender为空值。
Pandas_04合并数据集_第5张图片

  • 全外连接 outer
# 全连接
pd.merge(student_data,score_data,on='id',how ='outer')

左右侧的DataFrame的并集
Pandas_04合并数据集_第6张图片

  • 如果两个DataFrame连接键都是索引,则需要用到left_index 和right_index

此时为内连接,其他连接方式可参照上面几个例子。

# 交集
pd.merge(left=student_data,right=score_data,left_index =True,right_index =True)

Pandas_04合并数据集_第7张图片

  • 如果两个DataFrame其中一方连接键为索引,另一方为列数据
# 重置索引
student_data.reset_index(inplace=True)
# 设置索引
student_data.set_index(keys =['id','name'],inplace =True)
student_data

连接键id,name为索引
Pandas_04合并数据集_第8张图片

score_data.reset_index(inplace =True)
score_data

连接键id,name为values
Pandas_04合并数据集_第9张图片
进行内连接

pd.merge(student_data,score_data,left_index = True,right_on=['id','name'])

Pandas_04合并数据集_第10张图片拓展:除了上述方式,还可以使用join进行两个DataFrame之间的连接

DataFrame1

Pandas_04合并数据集_第11张图片

DataFrame2
Pandas_04合并数据集_第12张图片使用实例方法join进行连接

# left.join(right)
# 默认左连接
student_data.join(score_data, lsuffix='_left', rsuffix='_right')

Pandas_04合并数据集_第13张图片

三、pandas.concat:轴向连接

也可成为连接、绑定、堆叠。

  • pd.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)

numpy 中 concatenation函数

常用参数说明:
objs:参与连接的Pandas对象的列表或字典
axis:连接的轴向,默认0,纵向连接
join:{inner,outer},默认outer,取并集
join_axes:指明其他用于n-1条轴的索引,不执行并集/交集运算 
keys:用于形成连接轴上的层次化索引
levels:若设置了的keys,指定用于层次化索引各级别上的索引
names:若设置了levels和keys,用于创建分级别的名称
ignore_index:不保留连接轴上的索引,产生一组新索引
'''
  • 纵向堆叠

DataFrame1:
Pandas_04合并数据集_第14张图片DataFrame2:
Pandas_04合并数据集_第15张图片

取并集

pd.concat([student_data,score_data1])

可以看出数据纵向进行了合并,索引值并不连贯
Pandas_04合并数据集_第16张图片
设置 ignore_index,不保留连接轴上的原索引,产生一组新索引

pd.concat([student_data,score_data1],ignore_index=True)

Pandas_04合并数据集_第17张图片
对于进行合并的两个DataFrame,在合并的方向上产生了两个索引。
当行拼接若有相同的索引时,为区分索引,我们在最外层定义了索引的分组情况。

pd.concat([student_data,score_data1],keys=[['data1','data2']])

Pandas_04合并数据集_第18张图片在这里插入图片描述

  • 横向堆叠

按照索引进行横向堆叠

DataFrame1:
Pandas_04合并数据集_第19张图片DataFrame2:
Pandas_04合并数据集_第20张图片取交集:

pd.concat([student_data,score_data1],keys=['data1','data2'],axis=1,join='inner')

可以看出根据行索引4,5横向合并了两个DataFrame的数据。
Pandas_04合并数据集_第21张图片

四、DataFrame.combine_first:合并重叠数据

DataFrame1与DataFrame2有一部分重叠数据,当DataFrame1这部分重叠数据有缺失的时候,用DataFrame2的数据,无缺失,用自己的。

import numpy as np
s1 = pd.Series([np.nan, 2.5, np.nan, 3.5, 4.5, np.nan],index=['f', 'e', 'd', 'c', 'b', 'a'])
s2 = pd.Series(np.arange(len(s1), dtype=np.float64),index=['f', 'e', 'd', 'c', 'b', 'a'])

可以看出s1中f,d,a皆有缺失值,这三个值,可以用s2的来填补
Pandas_04合并数据集_第22张图片

Pandas_04合并数据集_第23张图片
合并:

s1.combine_first(s2)

Pandas_04合并数据集_第24张图片

你可能感兴趣的:(numpy,python)