Bootstrap

数据合并--Pandas

1. 键匹配合并:merge()函数

1.1 函数功能

合并DataFrame或者命名的Series,命名的Series被视为单列的DataFrame

1.2 函数语法

pandas.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=None, indicator=False, validate=None)

1.3 函数参数

参数含义
leftDataFrame或者命名的Series
rightDataFrame或者命名的Series
how合并方式:left:左合并;right:右合并;outer:并集;inner:取交集;cross:两个DataFrame的笛卡尔积;默认为:inner方式
on合并的键,当两个DataFrame中均存在该键时使用
left_on指定左边DataFrame中的键
right_on指定右边DataFrame中的键
left_index布尔型,默认取值为False,不清楚具体用法
right_index布尔型,默认取值为False,不清楚具体用法
sort布尔型,默认为True,不太理解
suffixes合并两个DataFrame时,除键外还包含相同的列,如何对列进行命名,默认为(_x,_y),可以自己定义:长度为2的字符串序列
copy默认取值为True,结果DataFrame为新的DataFrame
indicator是否新增一列表名数据来源的列,数据来源:left_only:左边DataFrame;right_only右边DataFrame;both:两个DataFrame
validate,字符串,可选参数,判定是否是指定的合并类型:“one_to_one” or “1:1”;“one_to_many” or “1:m”;“many_to_one” or “m:1”;“many_to_many” or “m:m”

1.3.1 数据合并:默认合并方式

默认合并方式为:inner,两个DataFrame均有的数据将会被保留下来。可以观察到两个df中的键有相同的列名:cust_ID,因此,此时不需要单独指定left_on与right_on,可以直接使用on后面跟共同的列名

import pandas as pd
import numpy as np

cust = pd.read_csv('C:\\Users\\changyanhua\\Desktop\\customer.csv',encoding='gbk')
cred = pd.read_csv('C:\\Users\\changyanhua\\Desktop\\credit.csv',encoding='gbk')
print(cust)
print(cred)

data1 = pd.merge(cust, cred, on='cust_ID')
print(data1)

在这里插入图片描述

1.3.2 左/右合并

左合并,以左侧df的数据框为主,将右侧df的内容连接到左侧,左侧df的内容全部保留,右侧有无对应内容以空值填充。同理,可理解右合并。

data2 = pd.merge(cust, cred, on='cust_ID',how='left')
print(data2)
data3 = pd.merge(cust, cred, on='cust_ID',how='right')
print(data3)

在这里插入图片描述

1.3.3 外连接

左右两边的内容均会出现在结果中,对应内容的内容以空值填充

data4 = pd.merge(cust, cred, on='cust_ID',how='outer')
print(data4)

在这里插入图片描述

1.3.4 left_on与right_on

当两个df中的键列名不同时,需要分别指定两个df中的键

cred.rename(columns={'cust_ID':'ID'},inplace=True)
print(cred)
data5 = pd.merge(cust, cred, left_on='cust_ID',right_on='ID')
print(data5)

在这里插入图片描述

1.3.5 指定重复列的名称

cust = pd.read_csv('C:\\Users\\changyanhua\\Desktop\\customer.csv',encoding='gbk')
cred = pd.read_csv('C:\\Users\\changyanhua\\Desktop\\credit.csv',encoding='gbk')
print(cust)
print(cred)
data6=pd.merge(cust, cred, on='cust_ID',suffixes=['_cust','_cred'])
print(data6)

在这里插入图片描述

2. 拼接函数:cancat()

2.1 函数功能

沿着指定轴拼接对象

2.2 函数语法

pandas.concat(objs, *, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=None)

2.3 函数参数

参数含义
objs拼接的对象,可以是
axis沿着哪个轴拼接:0或“index":按行合并;1或”columns":按列合并,默认按行
join合并的时候axis外的索引对其方式: ‘inner’, ‘outer’,默认outer:取并集
ignore_index布尔值,默认为False:保留原来对象的索引值;True:按照0,…n-1重新编排索引
keys添加一级索引,以区分不同的合并对象,默认为None
levels构建多层索引,默认为None
names给层次索引添加标题,默认None
vertify_intergrity布尔值,检验连接后的轴是否存在重复值,默认False:不检查
sort布尔值,默认False,对非拼接方向的索引进行排序
copy默认值True

2.3.1 默认参数拼接

此时拼接的结果按行拼接,列的对其方式是:outer,只有一个df中存在的列进行保留,索引值不会重新排列,保留原来的索引,不添加高一级的层级标题等内容,不对索引值是否重复进行校验。

cust1 = pd.read_csv('C:\\Users\\changyanhua\\Desktop\\cust1.csv',encoding='gbk')
cust2 = pd.read_csv('C:\\Users\\changyanhua\\Desktop\\cust2.csv',encoding='gbk')

print(cust1)
print(cust2)
cus1 = pd.concat([cust1,cust2])
print(cus1)

在这里插入图片描述

2.3.2 拼接只保留共同的列:join=inner

cus1 = pd.concat([cust1,cust2],join='inner')
print(cus1)

在这里插入图片描述

2.3.3 对合并方向的索引列重新标注索引

cus1 = pd.concat([cust1,cust2],join='inner',ignore_index=True)
print(cus1)

在这里插入图片描述

2.3.4 对非拼接方向的索引排序

cus1 = pd.concat([cust1,cust2],join='outer',ignore_index=True,sort=True)
print(cus1)

在这里插入图片描述

2.3.5 纵向拼接:axis=1

cust1 = pd.read_csv('C:\\Users\\changyanhua\\Desktop\\cust1.csv',encoding='gbk')
cust2 = pd.read_csv('C:\\Users\\changyanhua\\Desktop\\cust2.csv',encoding='gbk')

print(cust1)
print(cust2)
cus1 = pd.concat([cust1,cust2],join='outer',axis=1)
print(cus1)

在这里插入图片描述

cus1 = pd.concat([cust1,cust2],join='outer',axis=1,ignore_index=True)
print(cus1)

在这里插入图片描述
可以看到此时对索引进行重新标注是没有意义的,ignore_index=True适用于索引没有实际意义的情况。

;