分析一个业务的时候往往涉及到很多数据,比如企业融资信息、投资机构信息、行业标签、招聘数据、政策数据等,这些数据分别存储在不同的表中。通过堆叠合并和主键合并等多种合并方式,可以将这些表中需要的数据信息合并在一张表中供分析使用。
堆叠合并就是简单的把两个表拼在一起,分为横向堆叠和纵向堆叠。
横向堆叠就是指将后一个表的数据堆叠到前一个表的后几列,可以使用 concat 函数完成。
concat 函数基本语法
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,copy=True)
objs:表示需要合并的表的组合[d1, d2],接收多个Series, DataFrame, Panel 的组合,无默认;
axis:默认为0,axis=0表示做列对齐,列名一致的话,将后表数据添加到前表的下几行;
axis=1表示做行对齐,行标签一致的话,将后表的数据添加到前表的后几列;
join:默认为outer,接收‘inner’或‘outer’,表示取交集或并集;
其他参数相对不是那么常用,有兴趣的可以参考:concat函数的常用参数及说明
Python代码
# -*- coding=utf-8 -*-
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
import math
#导入数据
eventfile = u'D:\\pythondata\\yuchuli\\event.xlsx'#投融资事件
event = pd.read_excel(eventfile)
event = DataFrame(event)
eventbufile = u'D:\\pythondata\\yuchuli\\event_bu.xlsx'#投融资事件补充数据
event_bu = pd.read_excel(eventbufile)
event_bu = DataFrame(event_bu)
#合并文件
event_1 = pd.concat([event, event_bu], axis = 1, join='outer', sort=False)
event_2 = pd.concat([event, event_bu], axis = 0, join='outer', sort=False)
event_3 = pd.concat([event, event_bu], axis = 1, join='inner', sort=False)
event_4 = pd.concat([event, event_bu], axis = 0, join='inner', sort=False)
print("原文件,左文件的大小:", event.shape)
print("原文件,右文件的大小:", event_bu.shape)
print("axis = 1, join='outer'合并后的文件大小:", event_1.shape, "--行数取并集1000,右文件添加到左文件的后几列")
print("axis = 0, join='outer'合并后的文件大小:", event_2.shape, "--列数取并集13,右文件添加到左文件的下几行")
print("axis = 1, join='inner'合并后的文件大小:", event_3.shape, " --行数取交集100,右文件添加到左文件的后几列")
print("axis = 0, join='inner'合并后的文件大小:", event_4.shape, "--列数取交集11,右文件添加到左文件的下几行")
输出结果:
原文件,左文件的大小: (1000, 11) 原文件,右文件的大小: (100, 13) axis = 1, join='outer'合并后的文件大小: (1000, 24) --行数取并集1000,右文件添加到左文件的后几列 axis = 0, join='outer'合并后的文件大小: (1100, 13) --列数取并集13, 右文件添加到左文件的下几行 axis = 1, join='inner'合并后的文件大小: (100, 24) --行数取交集100, 右文件添加到左文件的后几列 axis = 0, join='inner'合并后的文件大小: (1100, 11) --列数取交集11, 右文件添加到左文件的下几行
所以,横向堆叠就是指 concat 函数的参数 axis = 1 的情况(右文件添加到左文件的后几列),至于是用 ‘inner’ 或 ‘outer’ ,就要视实际情况而定了,但是一般情况下是使用 outer ,通俗的讲,一般合并数据的人都不希望越合并越小了。
与横向堆叠相对的,纵向堆叠则是指将后一个表的数据堆叠到前一个表的下几行,也就是上述Python代码中 concat 函数的参数 axis = 0 的情况。除了 concat 函数,append 方法也可以实现纵向堆叠。
Python代码
# -*- coding=utf-8 -*-
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
#导入数据
eventfile = u'D:\\pythondata\\yuchuli\\event.xlsx'#投融资事件
event = pd.read_excel(eventfile)
event = DataFrame(event)
eventbufile = u'D:\\pythondata\\yuchuli\\event_bu.xlsx'#投融资事件补充数据
event_bu = pd.read_excel(eventbufile)
event_bu = DataFrame(event_bu)
#合并文件
event_1 = event.append(event_bu, sort=False)
event_2 = pd.concat([event, event_bu], axis = 0, join='outer', sort=False)
print("原文件,左文件的大小:", event.shape)
print("原文件,右文件的大小:", event_bu.shape)
print("append 方法合并后的文件大小:", event_1.shape)
print("axis = 0, join='outer'合并后的文件大小:", event_2.shape)
输出结果:
原文件,左文件的大小: (1000, 11) 原文件,右文件的大小: (100, 13) append 方法合并后的文件大小: (1100, 13) axis = 0, join='outer'合并后的文件大小: (1100, 13)
所以,append 方法对应的是 concat 函数中 axis = 0, join='outer' 的情况。
主键合并就是指前后两个表按照一个或者多个键匹配的方式连接起来,一般是以某一或多列为键,匹配其他列,很类似 SQL 中的 join。pandas 库中的 merge 函数和 join 函数都可以实现主键合并,和 SQL 中的 join 一样, merge 函数和 join 函数也有左连接(left)、右连接(right)、内连接(inner)、外链接(outer)。
merge 函数不仅可以实现 SQL 中的 join 函数的全部功能,还可以在匹配的过程中对数据进行排序,通过其中的 sort 参数实现。
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, right:分别表示需要匹配的左表和右表,可接收的数据类型为 DataFrame;
how:表示左右表的连接方式,默认为 inner ,可接收的取值为 left、right、inner、outer;
on:表示左右表的连接主键,两个表的主键名称一致的时候才可以使用 on 参数,不一致时需使用left_on,right_on参数, on 参数默认为None,可接收的数据类型为 str 或 sequence ;
left_on,right_on:分别表示左表和右表的连接主键,默认为None,可接收的数据类型为 str 或 sequence ;
sort:表示是否对合并后的数据进行排序,默认为False,可接收的数据类型为boolean ;
其他参数相对不是那么常用,有兴趣的可以参考:merge函数的常用参数及说明
join 函数基本语法
data1.join(data2, on=None,how='inner', lsuffix='', rsuffix='', sort=False)
join 函数与 merge 函数 不同之处在于,join 函数要求两个主键的名称必须相同。
Python代码
# -*- coding=utf-8 -*-
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
import math
#导入数据
eventfile = u'D:\\pythondata\\yuchuli\\event.xlsx'#投融资事件
event = pd.read_excel(eventfile)
event = DataFrame(event)
event['事件id'] = event['事件id'].astype('str')#主键转化成str格式
institutionfile = u'D:\\pythondata\\yuchuli\\institution.xlsx'#事件id对应投资机构
institution = pd.read_excel(institutionfile)
institution = DataFrame(institution)
institution = institution.dropna()#去空值
institution = institution.drop_duplicates()#去重复值
institution['事件id'] = institution['事件id'].astype('str')#主键转化成str格式
#合并文件
event_1 = pd.merge(event,institution, how='left', left_on='事件id', right_on='事件id')
event_2 = event.join(institution, on='事件id', how = 'left', rsuffix='1')
print("原文件,左文件的大小:", event.shape)
print("原文件,右文件的大小:", institution.shape)
print("append 方法合并后的文件大小:", event_1.shape)
print("join 方法合并后的文件大小:", event_2.shape)
输出结果:
原文件,左文件的大小: (1000, 11) 原文件,右文件的大小: (48757, 2) append 方法合并后的文件大小: (1178, 12) join 方法合并后的文件大小: (1178, 12)
数据处理的过程中偶尔会出现同样一份数据存储在两张表中,单看两张表的话,哪一张的数据都不算全,但是如果将其中一个表的数据补充进另外一个表中,生成的这张新表则是相对完整的数据。这种方法就叫重叠合并,pandas 库中提供了 combine_first 方法来实现这一功能。
combine_first 函数基本语法
data1.combine_first(data2)
Python代码
# -*- coding=utf-8 -*-
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
import math
#导入数据
df1 = pd.DataFrame([[3, 1, 7], [3, 5, np.nan],[np.nan, np.nan, np.nan]])
df2 = pd.DataFrame([[9, np.nan, 4], [2, 1, 4]], index=[1, 2])
#合并文件
df = df1.combine_first(df2)
print("合并前的df1:\n", df1)
print("合并前的df2:\n", df2)
print("combine_first 方法合并后的文件:\n", df)
输出结果:
合并前的df1: 0 1 2 0 3.0 1.0 7.0 1 3.0 5.0 NaN 2 NaN NaN NaN 合并前的df2: 0 1 2 1 9 NaN 4 2 2 1.0 4 combine_first 方法合并后的文件: 0 1 2 0 3.0 1.0 7.0 1 3.0 5.0 4.0 2 2.0 1.0 4.0
over!