Pandas 合並 concat


pandas處理多組數據的時候往往會要用到數據的合並處理,使用 concat是一種基本的合並方式.而且concat中有很多參數可以調整,合並成你想要的數據形式.

1、axis(合並方向):axis=0是預設值,因此未設定任何參數時,函數默認axis=0

>>> import pandas as pd
>>> import numpy as np
#定義資料集
>>> df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
>>> df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
>>> df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])
#concat縱向合並
>>> res = pd.concat([df1, df2, df3], axis=0)
>>> print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
0  1.0  1.0  1.0  1.0
1  1.0  1.0  1.0  1.0
2  1.0  1.0  1.0  1.0
0  2.0  2.0  2.0  2.0
1  2.0  2.0  2.0  2.0
2  2.0  2.0  2.0  2.0

仔細觀察會發現結果的index是0, 1, 2, 0, 1, 2, 0, 1, 2,若要將index重置,請看下面。

2、ignore——index(重置index)

#承上一個例子,並將index_ignore設定為True
>>> res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
>>> print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  1.0  1.0  1.0  1.0
4  1.0  1.0  1.0  1.0
5  1.0  1.0  1.0  1.0
6  2.0  2.0  2.0  2.0
7  2.0  2.0  2.0  2.0
8  2.0  2.0  2.0  2.0

結果的index變0, 1, 2, 3, 4, 5, 6, 7, 8。

3、join(合並方式)

join='outer'為預設值,因此未設定任何參數時,函數默認join='outer'。此方式是依照column來做縱向合並,有相同的column上下合並在一起,其他獨自的column個自成列,原本沒有值的位置皆以NaN填充。

>>> import pandas as pd
>>> import numpy as np
>>> df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
>>> df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])
#縱向"外"合並df1與df2
>>> res = pd.concat([df1, df2], axis=0, join='outer')
>>> print(res)
     a    b    c    d    e
1  0.0  0.0  0.0  0.0  NaN
2  0.0  0.0  0.0  0.0  NaN
3  0.0  0.0  0.0  0.0  NaN
2  NaN  1.0  1.0  1.0  1.0
3  NaN  1.0  1.0  1.0  1.0
4  NaN  1.0  1.0  1.0  1.0

#原理同上個例子的說明,但只有相同的column合並在一起,其他的會被拋棄。
#縱向"內"合並df1與df2
>>> res = pd.concat([df1, df2], axis=0, join='inner')
>>> print(res)
     b    c    d
1  0.0  0.0  0.0
2  0.0  0.0  0.0
3  0.0  0.0  0.0
2  1.0  1.0  1.0
3  1.0  1.0  1.0
4  1.0  1.0  1.0

#重置index並打印結果
>>> res = pd.concat([df1, df2], axis=0, join='inner', ignore_index=True)
>>> print(res)
     b    c    d
0  0.0  0.0  0.0
1  0.0  0.0  0.0
2  0.0  0.0  0.0
3  1.0  1.0  1.0
4  1.0  1.0  1.0
5  1.0  1.0  1.0

4、join_axes(依照axes合並)

>>> import pandas as pd
>>> import numpy as np
>>> df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
>>> df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])
#依照`df1.index`進行橫向合並
>>> res = pd.concat([df1, df2], axis=1, join_axes=[df1.index])
>>> print(res)
     a    b    c    d    b    c    d    e
1  0.0  0.0  0.0  0.0  NaN  NaN  NaN  NaN
2  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
3  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0

#移除join_axes,並打印結果
>>> res = pd.concat([df1, df2], axis=1)
>>> print(res)
     a    b    c    d    b    c    d    e
1  0.0  0.0  0.0  0.0  NaN  NaN  NaN  NaN
2  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
3  0.0  0.0  0.0  0.0  1.0  1.0  1.0  1.0
4  NaN  NaN  NaN  NaN  1.0  1.0  1.0  1.0

5、append(添加數據)

append只有縱向合並,沒有橫向合並。

>>> import pandas as pd
>>> import numpy as np 

>>> df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
>>> df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
>>> df3 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
>>> s1 = pd.Series([1,2,3,4], index=['a','b','c','d'])

#將df2合並到df1的下面,以及重置index,並打印出結果
>>> res = df1.append(df2, ignore_index=True)
>>> print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  1.0  1.0  1.0  1.0
4  1.0  1.0  1.0  1.0
5  1.0  1.0  1.0  1.0

#合並多個df,將df2與df3合並至df1的下面,以及重置index,並打印出結果
>>> res = df1.append([df2, df3], ignore_index=True)
>>> print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  1.0  1.0  1.0  1.0
4  1.0  1.0  1.0  1.0
5  1.0  1.0  1.0  1.0
6  1.0  1.0  1.0  1.0
7  1.0  1.0  1.0  1.0
8  1.0  1.0  1.0  1.0

#合並series,將s1合並至df1,以及重置index,並打印出結果
>>> res = df1.append(s1, ignore_index=True)
>>> print(res)
     a    b    c    d
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  1.0  2.0  3.0  4.0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM