索引上的合并
DataFrame中传入参数left_index=True或者right_index=True(或者两个都传入),表示DataFrame的index(索引)被用作两个DataFrame连接的连接键,如下:
dataframe1 = DataFrame({'key': ['a', 'c', 'a', 'b', 'b', 'a', 'a', 'b'], 'value': range(8)})
dataframe2 = DataFrame({'group_val':[2.5,3.6]},index=['a','b'])
打印print(pd.merge(dataframe1, dataframe2, left_on='key',right_index=True))结果如下:
dataframe1和dataframe2没有相同的列名,两者的merge也就没有对应的连接键。所以merge时,用两种不同的方法指出了连接键,dataframe1用的是left_on='key',dataframe2用的是right_index=True。因为dataframe2显式的指出了自己的索引键(index=['a','b']),所以用right_index指出了用索引键当作两个DataFrame连接的连接键。
(默认的merge方法求取的是连接键的交集,也可以通过外连接的方式获取连接键的并集,添加how='outer')
对于层次化索引的DataFrame,必须用列表的形式指出作为合并键的多个列,demo如下:
(pd.merge(dataframe1, dataframe2, left_on=['key1','key2'],right_index=True)
DataFrame的join方法,能够方便的实现按索引合并(即合并的两个DataFrame都有index,显式指出索引),也可以合并多个带有相同或相似索引的DataFrame对象。join方法在连接键上做左连接,即how='left'。下面两种,返回的效果一致:
pd.merge(dataframe1, dataframe2, left_on='key',right_index=True,how='left')
dataframe1.join(dataframe2,on='key')
join方法也支持传入一组DataFrame,即frame1.join([frame2,frame3],how='outer')。frame1,frame2,frame3必须都显式指出索引(index)的值。
轴向连接(concat)
s1 = Series([1,2],index=['a','b'])
s2 = Series([3,4,5],index=['c','d','e'])
s3 = Series([6,7],index=['f','g'])
pd.concat([s1,s2,s3])用于把值和索引连接起来,结果仍然是一个Series。默认情况下,concat是在axis=0(即行)上工作的,如果设置axis=1(即列),即pd.concat([s1,s2,s3],axis=1)结果就成了一个DataFrame,结果如下:
默认情况下,concat在axis=1的情况下实现的DataFrame是外连接组成的,即并集数据
s4 = pd.concat([s1*5,s3])
concat方法传入join='inner',即内连接时,可以得到交集数据。join表示连接方式
pd.concat([s1,s4],axis=1,join='inner')的结果如下:
可以通过join_axes方法,设置其他轴上使用的索引
pd.concat([s1, s4], axis=1, join_axes=[['a','b','d','f']])结果如下:
如果想在连接轴上出现层次化索引,需要添加keys参数,即:
pd.concat([s1, s2, s3],join=, keys=['one', 'two', 'three'])结果如下:
如果axis=1对Series组进行合并,结果就是keys作为DataFrame列的头部,代码显示如下:
pd.concat([s1, s2, s3], keys=['one', 'two', 'three'],axis=1)
另一种方法也可以实现上面的效果,
pd.concat({'one': s1, "two": s2, "three": s3}, axis=1)
传入的不是列表,是一个字典,字典的键作为keys选项的值。
concat函数的参数表:
objs:参与连接的pandas对象的列表或字典(第一个参数)。唯一必须的参数
axis:指明连接的轴向,默认为0,即行
join:“inner”,“outer”其中之一,默认为outer。指明其他轴向上的索引是按照交集(inner)还是并集(outer)进行合并
join_axes:指明用于其他n-1条轴的索引,不执行并集/交集运算
keys:与连接对象有关的值。用于形成连接轴向上的层次化索引。可以是任意值的列表或数组、元组数组、数组列表(如果将levels设置成多级数组的话)
levels:指定用作层次化索引各级别上的索引,如果设置了keys的话。
names:用于创建分层级别的名称,如果设置了keys或(和)levels的话。
verify_integrity:检查结果对象新轴上的重复情况,如果发现则引发异常。默认(False)引发重复
ignore_index:不保留连接轴上的索引,产生一组新索引range(total_length)