1. 程式人生 > >pandas22 pd.concat軸向連線(或繫結或堆疊)( tcy)

pandas22 pd.concat軸向連線(或繫結或堆疊)( tcy)

pd.concat軸向連線或繫結或堆疊 2018/12/29

1.函式
====================================================================
pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,
          keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)
用途:沿軸執行連線
    # 要連線任意數量的pandas物件(DataFrame或Series)
引數                              #說明
objs                              #序列或資料幀的列表或字典。字典鍵名用作keys層次化索引(最外層levels[0])
axis=0                           #指明連線的軸
join="outer"                #軸向上的索引是按交集inner還是並集outer進行合併
join_axes=None          #索引物件列表。用於其他n-1軸的特定索引,不執行並集/交集運算
                                     #即選取資料都有的索引進行合併
keys=None                  #連線軸向上的層次化索引。可以是任意值的列表或陣列、元組陣列、陣列列表(如果將levels設定成多級陣列的話)
levels =None               #指定層次化索引各級別levels上的索引,必須設定keys外層級別的索引
names=None              #建立分層索引級別levels的名稱, 必須設定了keys
verify _integrity=False#是否允許重複索引 ,True如發現則引發異常。預設允許重複
ignore_index=False    #不保留連線軸上的索引, 產生一組新索引range(total_length)
copy=True                  #副本

==================================================================== 注意: concat()製作資料副本,不斷重複使用可能會產生重大的效能損失。 如需要對多個數據集使用該操作,請使用列表推導。 frames = [ process_your_file(f) for f in files ] result = pd.concat(frames) ============================================================= 2.例項 df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],'B': ['B0', 'B1', 'B2'], 'C': ['C0', 'C1', 'C2']}) df2 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],'B': ['B3', 'B4', 'B5'],'C': ['C3', 'C4', 'C5']}) df3 = pd.DataFrame({'A': ['A6', 'A7', 'A8'],'B': ['B6', 'B7', 'B8'],'C': ['C6', 'C7', 'C8']}) df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6'],'D': ['D2', 'D3', 'D6'],'F': ['F2', 'F3', 'F6']},index=[2,3,4]) # 例項1:axis軸選擇 result = pd.concat([df1, df4], sort=False) #選擇axis=0水平方向合併 result1 =pd.concat([df1, df4], axis=1, sort=False)#選擇axis=1垂直方向合併 df1 A B C result result1 0 A0 B0 C0 A B C D F 1 A1 B1 C1 0 A0 B0 C0 NaN NaN A B C B D F 2 A2 B2 C2 1 A1 B1 C1 NaN NaN 0 A0 B0 C0 NaN NaN NaN df4 B D F 2 A2 B2 C2 NaN NaN 1 A1 B1 C1 NaN NaN NaN 2 B2 D2 F2 2 NaN B2 NaN D2 F2 2 A2 B2 C2 B2 D2 F2 3 B3 D3 F3 3 NaN B3 NaN D3 F3 3 NaN NaN NaN B3 D3 F3 4 B6 D6 F6 4 NaN B6 NaN D6 F6 4 NaN NaN NaN B6 D6 F6 ========================================================== # 例項2:join 內連線或外連線 # 索引是按交集inner還是並集outer 進行合併;預設join='outer'排序,sort=False不進行排序 result = pd.concat([df1, df4], join='outer',sort=False) #預設外連線 result1 = pd.concat([df1, df4], join='inner',sort=False)#內連線 df1 A B C result result1 0 A0 B0 C0 A B C D F B 1 A1 B1 C1 0 A0 B0 C0 NaN NaN 0 B0 2 A2 B2 C2 1 A1 B1 C1 NaN NaN 1 B1 df4 B D F 2 A2 B2 C2 NaN NaN 2 B2 2 B2 D2 F2 2 NaN B2 NaN D2 F2 2 B2 3 B3 D3 F3 3 NaN B3 NaN D3 F3 3 B3 4 B6 D6 F6 4 NaN B6 NaN D6 F6 4 B6 =========================================================== # 例項3:join_axes選取資料都有的索引進行合併 pd.concat([df1, df4], axis=1, join_axes=[df1.index]) A B C B D F 0 A0 B0 C0 NaN NaN NaN 1 A1 B1 C1 NaN NaN NaN 2 A2 B2 C2 B2 D2 F2 pd.concat([df1, df4], join_axes=[df1.columns]) A B C 0 A0 B0 C0 1 A1 B1 C1 2 A2 B2 C2 2 NaN B2 NaN 3 NaN B3 NaN 4 NaN B6 NaN ===================================================== # 例項4:keys行分層索引 frames = [df1, df2, df3] piece={'x': df1, 'y': df2, 'z': df3} result = pd.concat(frames) result1 = pd.concat(frames, keys=['x', 'y', 'z'],names=['key1','key2'])#行分層索引 result1 = pd.concat( piece,names=['key1','key2']) #行分層索引等價上面 result1 = pd.concat(piece, keys=['x', 'y','z'], #可任意選取要合併的列,任意放置順序 names=['key1','key2']) #行分層索引等價上面;names為分層索引名稱 result1 = pd.concat(piece, keys=['x', 'y', 'z'],names=['key1','key2'], #行分層索引等價上面 levels=[['x', 'y', 'z', 'w']]) #levels中要完全包含keys的元素 result1.loc['y'] #選擇塊y,結果同df2 df1 A B C result result1 0 A0 B0 C0 1 A1 B1 C1 A B C key1 key2 A B C 2 A2 B2 C2 0 A0 B0 C0 x 0 A0 B0 C0 df2 A B C 1 A1 B1 C1 1 A1 B1 C1 0 A3 B3 C3 2 A2 B2 C2 2 A2 B2 C2 1 A4 B4 C4 0 A3 B3 C3 y 0 A3 B3 C3 2 A5 B5 C5 1 A4 B4 C4 1 A4 B4 C4 df3 A B C 2 A5 B5 C5 2 A5 B5 C5 0 A6 B6 C6 0 A6 B6 C6 z 0 A6 B6 C6 1 A7 B7 C7 1 A7 B7 C7 1 A7 B7 C7 2 A8 B8 C8 2 A8 B8 C8 2 A8 B8 C8 ===================================================== # 例項5:ignore_index忽略索引 result1 =pd.concat([df1, df4], sort=False) result1 =df1.append(df4,sort=False) #等價上面 result2 =pd.concat([df1, df4], axis=0, sort=False, ignore_index=True) result2 =df1.append(df4, ignore_index=True,sort=False)#等價上面 result3 =pd.concat([df1, df4], axis=1, sort=False) result4 =pd.concat([df1, df4], axis=1, sort=False, ignore_index=True) result1 result2 result3 result4 A B C D F A B C D F A B C B D F 0 1 2 3 4 5 0 A0 B0 C0 NaN NaN 0 A0 B0 C0 NaN NaN 0 A0 B0 C0 NaN NaN NaN 0 A0 B0 C0 NaN NaN NaN 1 A1 B1 C1 NaN NaN 1 A1 B1 C1 NaN NaN 1 A1 B1 C1 NaN NaN NaN 1 A1 B1 C1 NaN NaN NaN 2 A2 B2 C2 NaN NaN 2 A2 B2 C2 NaN NaN 2 A2 B2 C2 B2 D2 F2 2 A2 B2 C2 B2 D2 F2 2 NaN B2 NaN D2 F2 3 NaN B2 NaN D2 F2 3 NaN NaN NaN B3 D3 F3 3 NaN NaN NaN B3 D3 F3 3 NaN B3 NaN D3 F3 4 NaN B3 NaN D3 F3 4 NaN NaN NaN B6 D6 F6 4 NaN NaN NaN B6 D6 F6 4 NaN B6 NaN D6 F6 5 NaN B6 NaN D6 F6 ======================================================= # 例項6:verify_integrity索引重疊是否忽略 pd.concat(frames, verify_integrity=True)#忽略重疊索引 pd.concat(frames, verify_integrity=True)#ValueError索引具有重疊值 ======================================================= # 例項7:與序列連線 # 例項7.1: s1 = pd.Series(['a', 'b']) s2 = pd.Series(['c', 'd']) result1=pd.concat([s1, s2]) result2=pd.concat([s1, s2],axis=1) result3=pd.concat([s1, s2], keys=['s1', 's2',],names=['key1','key2']) # result1 result2 result3 # key1 key2 # 0 a # s1 0 a # 1 b # 0 1 # 1 b # 0 c # 0 a c # s2 0 c # 1 d # 1 b d # 1 d ===================================================== # 例項7.2: s1 = pd.Series(['X0', 'X1', 'X2'], name='X') result = pd.concat([df1, s1,s1], axis=1) A B C X X 0 A0 B0 C0 X0 X0 1 A1 B1 C1 X1 X1 2 A2 B2 C2 X2 X2 result = pd.concat([df1, s1]) A B C 0 0 A0 B0 C0 NaN 1 A1 B1 C1 NaN 2 A2 B2 C2 NaN 0 NaN NaN NaN X0 1 NaN NaN NaN X1 2 NaN NaN NaN X2 ========================================================= # 例項7.3: s3 = pd.Series([0, 1, 2, 3], name='foo') s4 = pd.Series([0, 1, 2, 3]) s5 = pd.Series([0, 1, 4, 5]) pd.concat([s3, s4, s5], axis=1) foo 0 1 0 0 0 0 1 1 1 1 2 2 2 4 3 3 3 5 pd.concat([s3, s4, s5], axis=1, keys=['red','blue','yellow']) red blue yellow 0 0 0 0 1 1 1 1 2 2 2 4 3 3 3 5