合并数据
堆叠合并数据
横向堆叠
- 将两个表在x轴向拼接在一起。语法:
pandas.concat(objs,axis=0,join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,copy=True)
参数名称 |
说明 |
objs |
接收多个Series、DataFrame、Panel的组合。表示参与连接的pandas对象的列表的组合。无默认 |
axis |
接收0或1。表示连接的轴向,默认为0 |
join |
接收inner或outer。表示其他轴向上的索引是按交集还是并集进行合并。默认为outer |
join_axes |
接收Index对象。表示用于其他n-1条轴上的索引,不执行并集/交集运算 |
ignore_index |
接收boolean。表示是否不保留连接轴上的索引,产生一组新索引range(total_length)。默认为False |
keys |
接收sequence。表示与连接对象有关的值,用于形成连接轴向上的层次化索引。默认为None |
levels |
接收包含多个sequence的list。表示在指定keys参数后,指定用作层次化索引各级别上的索引。默认为None |
names |
接收list。表示在设置了keys和levels参数后,用于创建分层级别的名称。默认为None |
verify_integrity |
接收boolean。检查新连接的轴是否包含重复项。如果发现重复项,则引发异常。默认为False |
在内连接的情况下,仅仅返回索引重叠部分;在外连接的情况下,则显示索引的并集部分数据,不足的地方使用空值填补。
import numpy as np
import pandas as pd
from sqlalchemy import create_engine
conn = create_engine('mysql+pymysql://root:1234@\
127.0.0.1:3306/testdb?charset=utf8')
detail1 = pd.read_sql('meal_order_detail1',conn)
df1 = detail1.iloc[:,:10]
df2 = detail1.iloc[:,10:]
print('合并df1的大小为%s,df2的大小为%s。'%(df1.shape,df2.shape))
print('外连接合并后的数据框大小为:',pd.concat([df1,df2],
axis=1,join='inner').shape)
print('内连接合并后的数据框大小为:',pd.concat([df1,df2],
axis=1,join='outer').shape)
合并df1的大小为(2779, 10),df2的大小为(2779, 9)。
外连接合并后的数据框大小为: (2779, 19)
内连接合并后的数据框大小为: (2779, 19)
纵向堆叠
参数名称 |
说明 |
other |
接收DataFrame或Series。表示要添加的新数据。无默认 |
ignore_index |
接收boolean。如果输入True,就会对新生成的DataFrame使用新的索引(自动产生),默认为False |
verify_integrity |
接收boolean。如果输入True,那么当ignore_index为False时,会检查添加的数据索引是否冲突,如果冲突,则会添加失败。默认为False |
df3 = detail1.iloc[:1500,:]
df4 = detail1.iloc[1500:,:]
print('合并df3的大小为%s,df4的大小为%s。'%(df3.shape,df4.shape))
print('内连接纵向合并后的数据框大小为:',pd.concat([df3,df4],
axis=1,join='inner').shape)
print('外连接纵向合并后的数据框大小为:',pd.concat([df3,df4],
axis=1,join='outer').shape)
合并df3的大小为(1500, 19),df4的大小为(1279, 19)。
内连接纵向合并后的数据框大小为: (0, 38)
外连接纵向合并后的数据框大小为: (2779, 38)
print('堆叠前df3的大小为%s,df4的大小为%s。'%(df3.shape,df4.shape))
print('append纵向堆叠后的数据框大小为:',df3.append(df4).shape)
堆叠前df3的大小为(1500, 19),df4的大小为(1279, 19)。
append纵向堆叠后的数据框大小为: (2779, 19)
主键合并数据
- merge函数:可以左连接、内连接、外连接语法:
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=True,indicator=False)
- join方法:两个主键的名字必需相同。语法:
pandas.DataFrame.join(self,other,on=None,how='left',lsuffix='',rsuffix='',sort=False)
merge函数的参数及其说明
参数名称 |
说明 |
left |
接收DataFrame或Series。表示要添加的新数据1。无默认 |
right |
接收DataFrame或Series。表示要添加的新数据2。无默认 |
how |
接收inner、outer、left、right。表示数据的连接方式。默认为inner |
on |
接收string或sequence。表示两个数据合并的主键(必须一致)。默认为None |
left_on |
接收string或sequence。表示left参数接收数据用于合并的主键。默认为None |
right_on |
接收string或sequence。表示right参数接收数据用于合并的主键。默认为None |
sort |
接收boolean。表示是否根据连接键对合并后的数据进行排序。默认为False |
suffixes |
接收tuple。表示用于追加到left和right参数接收数据列名相同时的后缀。默认为(‘_x’,‘_y’) |
join方法的参数及其说明
参数名称 |
说明 |
other |
接收DataFrame、Series或者包含了多个DataFrame的list。表示参与李连杰的其他DataFrame。无默认 |
on |
接收列名或者包含列名的list或tuple。表示用于连接的列名。默认为None |
how |
接收特定string。取值为”inner“时代表内连接;取值为”outer“时代表外连接;取值为”left“时代表左连接;取值为”right“时代表右连接。默认为”inner“ |
lsuffix |
接收string。表示用于追加到左侧重叠列名的尾缀。无默认 |
rsuffix |
接收string。表示用于追加到右侧重叠列名的尾缀。无默认 |
sort |
接收boolean。根据连接键对合并后的数据进行排序,默认为False |
order = pd.read_csv('./data/meal_order_info.csv',sep=',',encoding='gb18030')
order['info_id'] = order['info_id'].astype('str')
order_detail = pd.merge(detail1,order,
left_on='order_id',right_on = 'info_id')
print('detail1订单详情表的原始形状为:',detail1.shape)
print('order订单信息表的原始形状为:',order.shape)
print('订单详情表和订单信息表主键合并后的形状为:',order_detail.shape)
detail1订单详情表的原始形状为: (2779, 19)
order订单信息表的原始形状为: (945, 21)
订单详情表和订单信息表主键合并后的形状为: (2779, 40)
order.rename({
'info_id':'order_id'},inplace=True)
order_detail1 = detail1.join(order,on='order_id',rsuffix='1')
print('订单详情表和订单信息表join合并后的形状为:',order_detail1.shape)
订单详情表和订单信息表join合并后的形状为: (2779, 40)
重复合并数据
- 当两张数据表内容基本一致,但是各有些缺失时,可以采用combine_first进行重叠数据合并。语法:
pandas.DataFrame.combine_first(other)
combine_first方法的参数及其说明
参数名称 |
说明 |
other |
接收DataFrame。表示参与重叠合并的另一个DataFrame。无默认 |
dict1 = {
'ID':[1,2,3,4,5,6,7,8,9],
'System':['win10','win10',np.nan,'win10',
np.nan,np.nan,'win7','win7','win8'],
'cpu':['i7','i5',np.nan,'i7',np.nan,np.nan,'i5','i5','i3']}
dict2 = {
'ID':[1,2,3,4,5,6,7,8,9],
'System':[np.nan,np.nan,'win7',np.nan,
'win8','win7',np.nan,np.nan,np.nan],
'cpu':[np.nan,np.nan,'i3',np.nan,'i7',
'i5',np.nan,np.nan,np.nan]}
df5 = pd.DataFrame(dict1)
df6 = pd.