利用Python进行数据分析之第七章 记录2 数据规整化:清理、转换、合并、重塑

索引上的合并

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)

猜你喜欢

转载自blog.csdn.net/shanghome/article/details/81167673