这一章节来介绍pandas中的DateFrame实现数据合并的操作,类似于SQL中的内连接、外连接的操作.
DataFrame中合并数据主要有两种方式 :Merge 、Concat
首先介绍一下merge方法的参数
pandas.merge(
right, #合并对象,dataframe或者series对象
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
)
参数说明
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003'],
'语文':[110,105,109],
'数学':[105,88,120],
'英语':[99,115,130]})
print(df1)
df2 = pd.DataFrame({'编号':['mr002','mr001','mr003','mr004'],
'体育':[34.5,39.7,38,45]})
print(df2)
df_merge=pd.merge(df1,df2,on='编号')
print(df_merge)
用on的时候需要注意两个df表的关联键名称需要一样,这里df1 和 df2 关联键是‘编号’(过程中可使用how来控制是左、右、内、外连接)
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号01':['mr001','mr002','mr003'],
'语文':[110,105,109],
'数学':[105,88,120],
'英语':[99,115,130]})
print(df1)
df2 = pd.DataFrame({'编号02':['mr002','mr001','mr003','mr004'],
'体育':[34.5,39.7,38,45]})
print(df2)
df_merge=pd.merge(df1,df2,left_on='编号01',right_on='编号02')
print(df_merge)
当关联键不同时,可以用left_on和 right_on的时候,需要两者同时出现,说明左右表的连接键。(过程中可使用how来控制是左、右、内、外连接)
import pandas
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号01':['mr001','mr002','mr003'],
'语文':[110,105,109],
'数学':[105,88,120],
'英语':[99,115,130]})
print(df1)
df2 = pd.DataFrame({'编号02':['mr002','mr001','mr003','mr004'],
'体育':[34.5,39.7,38,45]})
print(df2)
df_merge=pd.merge(df1,df2,how='outer',left_index=True,right_index=True)
print(df_merge)
使用left_index 和 right_index连接是指使用两张表的索引进行连接,当然需要两者同时出现。(过程中可使用how来控制是左、右、内、外连接)
结果如下:这里采用的外连接,大家可以看见连接的结果是对不上的。
这一章节主要是通过how来控制合并数据,这一章节单独介绍是因为有些同学可能没有接触过SQL的左、右、内、外连接的数据合并方式,这里单独介绍一下。
主要是通过连接键来控制数据合并的形式
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003'],
'学生姓名':['明日同学','高猿员','钱多多']})
print(df1)
df2 = pd.DataFrame({'编号':['mr001','mr001','mr003'],
'语文':[110,105,109],
'数学':[105,88,120],
'英语':[99,115,130],
'时间':['1月','2月','1月']})
print(df2)
df_merge=pd.merge(df1,df2,on='编号')
print(df_merge)
这里的数据中,mr001的同学有2个成绩,我们需要一对多地展示2行数据。
主要是指两个数据集中的列数据不是一对一的关系,是多对多的关系,这个时候我们需要将他们都连接起来一起展示。
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003','mr001','mr001'],
'体育':[34.5,39.7,38,33,35]})
print(df1)
df2 = pd.DataFrame({'编号':['mr001','mr002','mr003','mr003','mr003'],
'语文':[110,105,109,110,108],
'数学':[105,88,120,123,119],
'英语':[99,115,130,109,128]})
print(df2)
df_merge=pd.merge(df1,df2,on='编号')
print(df_merge)
这里两个数据表中的数据都是多对多的关系,这里将他们一一匹配出来。
介绍一下concat参数
pandas.concat(
objs,
axis=0,
join="outer",
ignore_index:False,
keys=None,
levels=None,
names=None,
verify_integrity: False,
sort: False,
copy: True
)
参数说明
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003'],
'体育':[34.5,39.7,38]})
print(df1)
df2 = pd.DataFrame({'编号':['mr001','mr002','mr003'],
'语文':[110,105,109],
'数学':[105,88,120],
'英语':[99,115,130]})
print(df2)
df_concat=pd.concat([df1,df2],axis=0)
print(df_concat)
import pandas as pd
#解决数据输出时列名不对齐的问题
pd.set_option('display.unicode.east_asian_width', True)
df1 = pd.DataFrame({'编号':['mr001','mr002','mr003'],
'体育':[34.5,39.7,38]})
print(df1)
df2 = pd.DataFrame({'编号':['mr001','mr002','mr003'],
'语文':[110,105,109],
'数学':[105,88,120],
'英语':[99,115,130]})
print(df2)
df_concat=pd.concat([df1,df2],axis=1)
print(df_concat)
通过控制axis来控制表的横向和纵向连接
总的来说,concat多用于长度相同的数据集进行横向连接。
《python数据分析从入门到实践》