1. 程式人生 > 其它 >pandas之concat連結操作

pandas之concat連結操作

Pandas 通過 concat() 函式能夠輕鬆地將 Series 與 DataFrame 物件組合在一起,函式的語法格式如下:

pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False)

引數說明如下所示:

引數名稱說明
objs 一個序列或者是Series、DataFrame物件。
axis 表示在哪個軸方向上(行或者列)進行連線操作,預設 axis=0 表示行方向。
join 指定連線方式,取值為{"inner","outer"},預設為 outer 表示取並集,inner代表取交集。
ignore_index 布林值引數,預設為 False,如果為 True,表示不在連線的軸上使用索引。
join_axes 表示索引物件的列表。

concat()

concat() 函式用於沿某個特定的軸執行連線操作。下面讓我們建立不同的物件,並對其進行連線。

  1. import pandas as pd
  2. a= pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
  3. 'B': ['B0', 'B1', 'B2', 'B3'],
  4. 'C': ['C0', 'C1', 'C2', 'C3'],
  5. 'D': ['D0', 'D1', 'D2', 'D3']},
  6. index=[0, 1, 2, 3])
  7. b= pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
  8. 'B': ['B4', 'B5', 'B6', 'B7'],
  9. 'C': ['C4', 'C5', 'C6', 'C7'],
  10. 'D': ['D4', 'D5', 'D6', 'D7']},
  11. #連線a與b
  12. print(pd.concat([a,b]))

輸出結果:

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
4  A4  B4  C4  D4
5  A5  B5  C5  D5
6  A6  B6  C6  D6
7  A7  B7  C7  D7

如果想把指定的鍵與 DataFrame 物件連線,您可以使用 keys 引數來實現。如下所示:

  1. import pandas as pd
  2. a= pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
  3. 'B': ['B0', 'B1', 'B2', 'B3'],
  4. 'C': ['C0', 'C1', 'C2', 'C3'],
  5. 'D': ['D0', 'D1', 'D2', 'D3']},
  6. index=[0, 1, 2, 3])
  7. b= pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
  8. 'B': ['B4', 'B5', 'B6', 'B7'],
  9. 'C': ['C4', 'C5', 'C6', 'C7'],
  10. 'D': ['D1', 'D2', 'D5', 'D6']},
  11. index=[2,3,4,5])
  12. #連線a與b,並給a,b連線一個指定的鍵
  13. print(pd.concat([a,b],keys=['x','y']))

輸出結果:

 A B C D
x 0 A0 B0 C0 D0
 1 A1 B1 C1 D1
 2 A2 B2 C2 D2
 3 A3 B3 C3 D3
y 2 A4 B4 C4 D1
 3 A5 B5 C5 D2
 4 A6 B6 C6 D5
 5 A7 B7 C7 D6

上述示中,可以看出行索引 index 存在重複使用的現象,如果想讓輸出的行索引遵循依次遞增的規則,那麼需要將 ignore_index 設定為 True。

  1. import pandas as pd
  2. a= pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
  3. 'B': ['B0', 'B1', 'B2', 'B3'],
  4. 'C': ['C0', 'C1', 'C2', 'C3'],
  5. 'D': ['D0', 'D1', 'D2', 'D3']},
  6. index=[0, 1, 2, 3])
  7. b= pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
  8. 'B': ['B4', 'B5', 'B6', 'B7'],
  9. 'C': ['C4', 'C5', 'C6', 'C7'],
  10. 'D': ['D1', 'D2', 'D5', 'D6']},
  11. index=[2,3,4,5])
  12. #連線a與b,設定 ignore_index 等於 True
  13. print(pd.concat([a,b],keys=['x','y'],ignore_index=True))

輸出結果:

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
4  A4  B4  C4  D1
5  A5  B5  C5  D2
6  A6  B6  C6  D5
7  A7  B7  C7  D6

注意:此時的索引順序被改變了,而且鍵 keys 指定的鍵也被覆蓋了。

如果您想要沿著 axis=1 新增兩個物件,那麼將會追加新的列。

  1. import pandas as pd
  2. a= pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
  3. 'B': ['B0', 'B1', 'B2', 'B3'],
  4. 'C': ['C0', 'C1', 'C2', 'C3'],
  5. 'D': ['D0', 'D1', 'D2', 'D3']},
  6. index=[0, 1, 2, 3])
  7. b= pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
  8. 'B': ['B4', 'B5', 'B6', 'B7'],
  9. 'C': ['C4', 'C5', 'C6', 'C7'],
  10. 'D': ['D1', 'D2', 'D5', 'D6']},
  11. index=[4,5,6,7])
  12. #沿著 axis=1,連線a與b
  13. print(pd.concat([a,b],axis=1))

輸出結果:

     A    B    C    D    A    B    C    D
0   A0   B0   C0   D0  NaN  NaN  NaN  NaN
1   A1   B1   C1   D1  NaN  NaN  NaN  NaN
2   A2   B2   C2   D2  NaN  NaN  NaN  NaN
3   A3   B3   C3   D3  NaN  NaN  NaN  NaN
4  NaN  NaN  NaN  NaN   A4   B4   C4   D1
5  NaN  NaN  NaN  NaN   A5   B5   C5   D2
6  NaN  NaN  NaN  NaN   A6   B6   C6   D5
7  NaN  NaN  NaN  NaN   A7   B7   C7   D6

append()

如果要連線 Series 和 DataFrame 物件,有一個最方便、快捷的方法,那就是 append() 方法。該方法沿著 axis=0 (行方向)進行操作。

  1. import pandas as pd
  2. a= pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
  3. 'B': ['B0', 'B1', 'B2', 'B3'],
  4. 'C': ['C0', 'C1', 'C2', 'C3'],
  5. 'D': ['D0', 'D1', 'D2', 'D3']},
  6. index=[0, 1, 2, 3])
  7. b= pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
  8. 'B': ['B4', 'B5', 'B6', 'B7'],
  9. 'C': ['C4', 'C5', 'C6', 'C7'],
  10. 'D': ['D1', 'D2', 'D5', 'D6']},
  11. index=[4,5,6,7])
  12. #沿著 axis=0,使用 apppend()方法連線a與b
  13. print(a.append(b))

輸出結果:

    A   B   C   D
0  A0  B0  C0  D0
1  A1  B1  C1  D1
2  A2  B2  C2  D2
3  A3  B3  C3  D3
4  A4  B4  C4  D1
5  A5  B5  C5  D2
6  A6  B6  C6  D5
7  A7  B7  C7  D6

當然 append() 函式也可接收多個物件,示例如下:

  1. a= pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
  2. 'B': ['B0', 'B1', 'B2', 'B3'],
  3. 'C': ['C0', 'C1', 'C2', 'C3'],
  4. 'D': ['D0', 'D1', 'D2', 'D3']},
  5. index=[0, 1, 2, 3])
  6. b= pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
  7. 'B': ['B4', 'B5', 'B6', 'B7'],
  8. 'C': ['C4', 'C5', 'C6', 'C7'],
  9. 'D': ['D1', 'D2', 'D5', 'D6']},
  10. index=[4,5,6,7])
  11. c= pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
  12. 'B': ['B8', 'B9', 'B10', 'B7'],
  13. 'C': ['C9', 'C8', 'C7', 'C6'],
  14. 'D': ['D8', 'D5', 'D7', 'D6']},
  15. index=[8,9,10,11])
  16. print(a.append(b,c,a))

輸出結果:

    A    B   C   D
0   A0   B0  C0  D0
1   A1   B1  C1  D1
2   A2   B2  C2  D2
3   A3   B3  C3  D3
4   A4   B4  C4  D1
5   A5   B5  C5  D2
6   A6   B6  C6  D5
7   A7   B7  C7  D6
8   A4   B8  C9  D8
9   A5   B9  C8  D5
10  A6   B10 C7  D7
11  A7   B7  C6  D6
0   A0   B0  C0  D0
1   A1   B1  C1  D1
2   A2   B2  C2  D2
3   A3   B3  C3  D3