1 concat
将数据根据不同的轴进行简单的融合
pd.concat(
objs,
axis=0,
join='outer',
join_axes=None,
ignore_index=False,
keys=None,
levels=None,
names=None,
verify_integrity=False)
1.1 主要参数说明
objs | series,dataframe构成的序列lsit |
axis | 需要合并链接的轴, 0是行(a[...][0] 和 b[...][0]合并,a[...][1] 和 b[...][1]合并) 1是列(a[0][...] 和 b[0][...]合并,a[1][...] 和 b[1][...]合并) |
join | 连接的方式 inner,或者outer 如果为'inner'得到的是两表的交集,如果是outer,得到的是两表的并集 |
key | 识别数据源自于哪张表 |
ignore_index | 设置为true之后,合并的两个表就会根据列字段对齐,然后合并。最后再重新整理一个新的index |
1.2 axis
需要合并链接的轴,
lst1=[['a0','b0','c0','d0'],
['a1','b1','c1','d1'],
['a2','b2','c2','d2'],
['a3','b3','c3','d3']]
lst2=[['a4','b4','c4','d4'],
['a5','b5','c5','d5'],
['a6','b6','c6','d6'],
['a7','b7','c7','d7']]
lst3=[['a8','b8','c8','d8'],
['a9','b9','c9','d9'],
['a10','b10','c10','d10'],
['a11','b11','c11','d11']]
df1=pd.DataFrame(lst1)
df2=pd.DataFrame(lst2)
df3=pd.DataFrame(lst3)
0是行(a[...][0] 和 b[...][0]合并,a[...][1] 和 b[...][1]合并)【默认】
pd.concat([df1,df2,df3],axis=0)
1是列(a[0][...] 和 b[0][...]合并,a[1][...] 和 b[1][...]合并)
pd.concat([df1,df2,df3],axis=1)
1.3 key
识别数据源自于哪张表
依旧是1.2的数据
pd.concat([df1,df2,df3],axis=0,keys=['df1','df2','df3'])
pd.concat([df1,df2,df3],axis=1,keys=['df1','df2','df3'])
1.3.1 也可以传入字典来增加分组键
lst1=[['a0','b0','c0','d0'], ['a1','b1','c1','d1'], ['a2','b2','c2','d2'], ['a3','b3','c3','d3']] lst2=[['a4','b4','c4','d4'], ['a5','b5','c5','d5'], ['a6','b6','c6','d6'], ['a7','b7','c7','d7']] df1=pd.DataFrame(lst1) df2=pd.DataFrame(lst2) pd.concat({'df1':df1,'df2':df2})
1.4 join
连接的方式 inner,或者outer
如果为'inner'得到的是两表的交集,如果是outer,得到的是两表的并集【默认outer】
lst1=[['a0','b0','c0','d0'],
['a1','b1','c1','d1'],
['a2','b2','c2','d2'],
['a3','b3','c3','d3']]
lst2=[['a4','b4','c4','d4'],
['a5','b5','c5','d5'],
['a6','b6','c6','d6'],
['a7','b7','c7','d7']]
df1=pd.DataFrame(lst1,columns=['A','B','C','D'])
df2=pd.DataFrame(lst2,columns=['A','B','E','F'])
pd.concat([df1,df2],axis=0,join='inner')
pd.concat([df1,df2],axis=0,join='outer')
1.5 ignore_index
设置为true之后,合并的两个表就会根据列字段对齐,然后合并。最后再重新整理一个新的index
lst1=[['a0','b0','c0','d0'],
['a1','b1','c1','d1'],
['a2','b2','c2','d2'],
['a3','b3','c3','d3']]
lst2=[['a4','b4','c4','d4'],
['a5','b5','c5','d5'],
['a6','b6','c6','d6'],
['a7','b7','c7','d7']]
df1=pd.DataFrame(lst1)
df2=pd.DataFrame(lst2)
pd.concat([df1,df2],axis=0)
pd.concat([df1,df2],axis=0,ignore_index=True)
2 append
默认沿着列进行拼接
result = df1.append(s2, ignore_index=True)
3 merge
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和right就是我们要merge的两个DataFrame
3.0 默认情况
首先,如果两个表格只有一个字段是一样的,那么就按照这个字段合并
比如我们有这样两个DataFrame (路名均为虚拟路名)
import pandas as pd data=[{'道路名称': '齐鹏中路','平均车速(工作日)':60,'拥挤情况(工作日)':'畅通'}, {'道路名称': '文蓁西路','平均车速(工作日)':45,'拥挤情况(工作日)':'拥挤'}, {'道路名称': '济鹏南路','平均车速(工作日)':75,'拥挤情况(工作日)':'畅通'}] df_1=pd.DataFrame(data) df_1
import pandas as pd data2=[{'道路名称': '齐鹏中路','平均车速(非工作日)':30,'拥挤情况(非工作日)':'堵塞'}, {'道路名称': '文蓁西路','平均车速(非工作日)':55,'拥挤情况(非工作日)':'畅通'}, {'道路名称': '长江北路','平均车速(非工作日)':15,'拥挤情况(非工作日)':'严重堵塞'}] df_2=pd.DataFrame(data2) df_2
此时直接merge,就会按照“道路名称”相同的来进行合并
pd.merge(df_1,df_2)
如果两个DataFrame有两列是一样的呢?
import pandas as pd data3=[{'道路名称': '齐鹏中路','平均车速(工作日)':60,'拥挤情况(工作日)':'畅通','施工与否':False}, {'道路名称': '文蓁西路','平均车速(工作日)':45,'拥挤情况(工作日)':'拥挤','施工与否':False}, {'道路名称': '济鹏南路','平均车速(工作日)':75,'拥挤情况(工作日)':'畅通','施工与否':False}] df_3=pd.DataFrame(data3) df_3
import pandas as pd data4=[{'道路名称': '齐鹏中路','平均车速(非工作日)':30,'拥挤情况(非工作日)':'堵塞','施工与否':True}, {'道路名称': '文蓁西路','平均车速(非工作日)':55,'拥挤情况(非工作日)':'畅通','施工与否':False}, {'道路名称': '长江北路','平均车速(非工作日)':15,'拥挤情况(非工作日)':'严重堵塞','施工与否':True}] df_4=pd.DataFrame(data4) df_4
此时默认合并时内连接:只有两个相同列上的元素都一样的列才会被选择
pd.merge(df_3,df_4)
3.1 on 参数——选择哪个字段作为merge的key
这个参数确定哪个字段作为主键
比如我们合并df1和df2的时候,设置主键位“道路名称”也是OK的
pd.merge(df_1,df_2,on='道路名称')
对于前面的df3和df4,我们可以选择一个列来进行merge
pd.merge(df_3,df_4,on='道路名称')
3.2 leftindex & rightindex——是否使用索引
除了指定字段作为主键以外,还可以考虑用索引作为拼接的主键,leftindex和rightindex默认为False,就是不以索引作为主键,同时调整为True就可以了。
pd.merge(df_1,df_2,left_index=True,right_index=True)
3.3 how——拼接方法
how参数控制拼接方式,默认内连接(inner),内连接是只将两个表主键一致的信息拼接到一起
3.3.1 outer 外连接
外连接是保留两个表的所有信息,拼接的时候遇到标签不能对齐的部分,用NAN进行填充
pd.merge(df_1,df_2,how='outer')
3.3.2 left 左连接
左连接是保留所有左表的信息,把右表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充:
pd.merge(df_1,df_2,how='left')
3.3.3 右连接
右连接是保留所有右表的信息,把左表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充:
pd.merge(df_1,df_2,how='right')
3.4 lefton & righton
如果两个DataFrame 没有一列的名字是一样的,我们可以手动指定lefton和righton
比如现在有这样的DataFrame
import pandas as pd
data5=[{'路名': '齐鹏中路','平均车速(非工作日)':30,'拥挤情况(非工作日)':'堵塞','施工与否':True},
{'路名': '文蓁西路','平均车速(非工作日)':55,'拥挤情况(非工作日)':'畅通','施工与否':False},
{'路名': '长江北路','平均车速(非工作日)':15,'拥挤情况(非工作日)':'严重堵塞','施工与否':True}]
df_5=pd.DataFrame(data5)
df_5
pd.merge(df_3,df_5,left_on='道路名称',right_on='路名')
3.5 suffixes
有时候两个表中有好几个相同的列名,除了作为主键的列之外,其他名字相同的列被拼接到表中的时候会有一个后缀表示这个列来自于哪个表格,用于区分名字相同的列
这个后缀默认是(x和y),我们可以使用suffixes来进行手动修改
pd.merge(df_1,df_2,left_index=True,right_index=True,suffixes=['(工作日)','(非工作日)'])
3.6 indicator
显示拼接后的表中哪些信息来自于哪一个表格
在表的最后就会有一个新列,显示这一条记录来自于在哪表格里有数据,如果两表都有数据会标记both。
pd.merge(df_1,df_2,how='outer',indicator=True)
4 join
在处理索引联接时特别高效
DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False, validate=None)
other | 另一个 DataFrame、Series |
on | 指定按照那一列拼接,默认按照index |
how | 指定联接的方式,默认为 'left'。可选项包括 'left'(左联接),'right'(右联接),'outer'(外联接),'inner'(内联接) |
lsuffix 和 rsuffix | 当两个 DataFrame 中存在重叠的列名时,用来添加到左、右 DataFrame 重叠列名的后缀 |
参考文献