本篇文章主要介紹了pandas中對series和dataframe對象進行連接的方法:pd.append()和pd.concat(),文中通過示例代碼對這兩種方法進行了詳細的介紹,希望能對各位python小白的學習有所幫助。
上篇我們講了pd.append(),下篇我們繼續介紹pd.concat()
二、pd.concat([df_01,df_02])
描述:concat方法用以將兩個或多個pandas對象根據軸(橫向/縱向)進行拼接,concat函數是在pandas命名空間下的方法,因此需要通過pd.concat()的方式來引用。
語法: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』)
常用參數:
objs:要進行拼接的pandas對象,可用中括號[]將兩個或多個對象括起來axis:指定對象按照那個軸進行拼接,默認為0(縱向拼接),1為橫向橫向拼接join:拼接的方式,inner為交集,outer為併集join_axes:index的列表,僅在橫向合併時使用,指明要將數據合併入哪個原表的index。ignore_index:默認為False,如果設置為true,則無視表原來的軸標籤,直接合併,合併後生成新的軸標籤。keys:表標識的列表,用來區分合併的表來自哪裡。
下面,將對concat方法以上各個參數進行詳細說明:
第一個要學習的參數為objs:要進行拼接的pandas對象,可用中括號[]將兩個或多個對象括起來。
1)對series進行拼接
<<< ser1=pd.Series(np.arange(9))<<< ser2=pd.Series(np.arange(9))# 對兩個series對象進行拼接<<< pd.concat([ser1,ser2])001122334455667788001122334455667788dtype: int32
對DataFrame進行拼接
<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['D','E','F'],index=['e','f','g'])# 對兩個DataFrame對象進行拼接<<< pd.concat([df1,df2]) A B C D E Fa 012 NaN NaN NaNb 345 NaN NaN NaNc 678 NaN NaN NaNe NaN NaN NaN 012f NaN NaN NaN 345g NaN NaN NaN 678
第二個要學習的參數為axis:指定對象按照那個軸進行拼接,默認為0(縱向拼接),1為橫向橫向拼接。
<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['D','E','F'],index=['a','b','d'])# 將數據對象df1和df2沿1軸進行拼接,即進行橫向拼接<<< pd.concat([df1,df2],axis=1) A B C D E Fa 012012b 345345c 678 NaN NaN NaNd NaN NaN NaN 678
注意:當對Series進行拼接時,設置axis=0進行縱向拼接的結果對象為Series,設置axis=1進行橫向拼接的結果對象為DataFrame。
<<< ser1=pd.Series(np.arange(9))<<< ser2=pd.Series(np.arange(9))# 對Series進行拼接縱向拼接,結果認為Series對象<<< a=pd.concat([ser1,ser2],axis=0)<<<type(a)pandas.core.series.Series# 對Series進行拼接橫向拼接,結果轉換為DataFrame對象<<< b=pd.concat([ser1,ser2],axis=1)<<<type(b)pandas.core.frame.DataFrame
第三個要學習的參數為join:拼接的方式,inner為交集,outer為併集,橫向拼接時由index的交/併集決定,縱向拼接時由columns的交/併集決定,同時,如果join=outer,匹配不上的地方以nan填充。
<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['D','E','F'],index=['a','b','d'])# 將df1和df2進行橫向合併,取二者的併集<<< pd.concat([df1,df2],axis=1) A B C D E Fa 012012b 345345c 678 NaN NaN NaNd NaN NaN NaN 678# 將df1和df2進行橫向合併,只取二者的交集<<< pd.concat([df1,df2],axis=1,join='inner') A B C D E Fa 012012b 345345
第四個要學習的參數為join_axes:以哪個數據對象的index/columns作為軸進行拼接,當進行橫向拼接時,join_axes為index的列表,如需根據df1對齊數據,則會保留df1的index,再將df2的數據進行拼接;同理,縱向拼接時為columns的列表。
<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['D','E','F'],index=['a','b','d'])# 根據df1的index對齊數據<<< pd.concat([df1,df2],axis=1,join_axes=[df1.index]) A B C D E Fa 012012b 345345c 678 NaN NaN NaN# 根據df2的index對齊數據<<< pd.concat([df1,df2],axis=1,join_axes=[df2.index]) A B C D E Fa 012012b 345345d NaN NaN NaN 678
第五個要學習的參數為ignore_index:默認為False,如果設置為true,則無視表原來的軸標籤,直接合併,合併後生成新的軸標籤。
這裡需要注意的是,與append方法只能進行縱向拼接不同,concat方法既可以進行橫向拼接,也可以進行縱向拼接,若設置ignore_index=True,當進行橫向拼接時,則無視原表的columns,直接合併,合併後生成默認的columns;同理,當進行縱向拼接時,則是忽略原表的index,生成新的index。
<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['D','E','F'],index=['a','b','d'])# 橫向拼接時,忽略的是columns,index仍起作用<<< pd.concat([df1,df2],axis=1,ignore_index=True)012345a 012012b 345345c 678 NaN NaN NaNd NaN NaN NaN 678# 縱向拼接時,忽略的是index,columns仍起作用pd.concat([df1,df2],axis=0,ignore_index=True)012345a 012012b 345345c 678 NaN NaN NaNd NaN NaN NaN 678
第六個要學習的參數為keys:表標識的列表,用來區分合併後的數據來源於哪個表,當ignore_index=True時,此參數的作用失效。
<<< df1=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['A','B','C'],index=['a','b','c'])<<< df2=pd.DataFrame(np.arange(9).reshape(3,3),columns=<<<['D','E','F'],index=['a','b','d'])# 設置ignore_index=True時,參數keys不起作用<<< pd.concat([df1,df2],axis=1,ignore_index=True,keys=<<<['df1','df2'])012345a 012012b 345345c 678 NaN NaN NaNd NaN NaN NaN 678# 設置ignore_index=False,會根據keys的列表標識結果中的數據來源<<< pd.concat([df1,df2],axis=1,ignore_index=False,keys=<<<['df1','df2']) df1 df2 A B C D E Fa 012012b 345345c 678 NaN NaN NaNd NaN NaN NaN 678
總結:
append方法只能進行橫向拼接,且只支持對兩個對象進行拼接操作,但append支持單個對象的連接,此方法常用於循環中;concat方法可用於橫向或縱向的拼接,同時可以設置以併集或交集的方式拼接
如對append和concat方法還感興趣,建議可前往查看官方文檔:
1)https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.append.html?highlight=append#pandas.DataFrame.append
2)pandas.concat - pandas 0.21.0 documentation