1. 程式人生 > >利用Python進行資料分析之第七章 記錄2 資料規整化:清理、轉換、合併、重塑

利用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)